geweitt 2020-10-20 13:10 采纳率: 0%
浏览 502

gdb调试时,发现Program received signal SIGSEGV。求解决

按书上说的,写了个程序,编译时发生“段错误 (核心已转储)”,然后用gdb来调试,发现问题是Program received signal SIGSEGV, Segmentation fault.

gcc的版本是gcc version 9.3.0 (系统是Ubuntu20.04)

文件名cpuid2.s,代码是

#cpuid2.s View the CPUID Vendor ID string using C library calls
.code32
.section .data
output:
    .asciz "The processor Vendor ID is '%s'\n"
.section .bss
    .lcomm buffer, 12
.section .text
.globl main
main:
    movl $0, %eax
    cpuid
    movl $buffer, %edi
    movl %ebx, (%edi)
    movl %edx, 4(%edi)
    movl %ecx, 8(%edi)
    pushl $buffer
    pushl $output
    call printf
    addl $8, %esp
    pushl $0
    call exit

gdb调试的结果是

图片说明

求大神帮忙分析!谢谢!

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 17:55
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码在运行过程中遇到了一个内存访问错误(Segmentation fault),这通常是由以下原因引起的:

    1. 段错误:这是由于未定义的行为导致的错误。在这种情况下,可能是因为你尝试了对不可见变量进行访问。

    2. 越界:可能是你试图访问了一个超出其有效范围的数据或内存区域。

    3. 缺少初始化:如果一些数据结构或变量没有被正确地初始化,那么它们可能会因为缺乏正确的值而引发错误。

    为了确定问题的原因,你可以采取以下几个步骤:

    1. 查看源代码:确保你的代码中没有任何可能导致此类错误的逻辑错误。

    2. 使用断点和单步执行:通过使用breakpoint语句,在代码中插入断点,并逐步执行代码以查看它如何工作。

    3. 使用 disassembleprint 命令:这些命令可以帮助你理解代码是如何工作的,并帮助你识别可能的问题。

    4. 使用 readelf -dobjdump -d 命令:这些工具可以显示目标机器的目标代码,有助于定位潜在的问题。

    5. 使用 objdumpnm 命令:这些命令可以帮助你找到并打印出目标机器的目标代码中的符号表。

    6. 使用 gdb 的调试模式:使用 run 命令启动程序,然后使用 breakpointcontinuestepprint 命令来检查程序的行为。

    7. 在线搜索:如果你无法解决问题,可以在网络上搜索类似的问题,看看是否有其他人遇到过相似的情况,并尝试他们提供的解决方案。

    请注意,上述建议仅供参考。具体的解决方案取决于问题的具体细节。如果你能提供更详细的信息,比如错误消息、代码片段等,我将能够为你提供更具体的支持。

    评论
    编辑
    预览

    报告相同问题?

    手机看
    程序员都在用的中文IT技术交流社区

    程序员都在用的中文IT技术交流社区

    专业的中文 IT 技术社区,与千万技术人共成长

    专业的中文 IT 技术社区,与千万技术人共成长

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    客服 返回
    顶部