在测试程序时,我遇到了一个分段故障,它丢弃了所需的核心。
我正在使用gdb调试核心文件: gdb / path / to / exec path / to / core
在查看核心文件(和源代码)之后,我意识到问题实际上是在使用“strcmp”函数时发生的NULL指针取消引用。
但是,核心文件回溯提供了以下错误消息:
程序终止,信号SIGSEGV,Segmentation fault。
#0 __strcmp_sse2_unaligned()at ../ sysdeps / x86_64 / multiarch / strcmp-sse2-unaligned.S:32
32 ../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S:没有这样的文件或目录。
(gdb)bt
#0 __strcmp_sse2_unaligned()at ../ sysdeps / x86_64 / multiarch / strcmp-sse2-unaligned.S:32
在main.c中的#1 0x00000000004041f1(argc = 1,argv = 0x7ffced1f8ae8):1144
现在这是一个我无法理解的奇怪信息。我不确定为什么gdb正在打印此消息“../ sysdeps / x86_64 / multiarch / strcmp-sse2-unaligned.S:没有这样的文件或目录”。
我应该得到一些与NULL指针去引用有关的消息,但是得到了这个。那是什么意思?
答案 0 :(得分:1)
这个错误看起来很神秘,但它是正确的。它显示strcmp
正在进行空指针去引用,这是从代码的第1144行调用的。
分段错误是指尝试访问无效的内存页面:其段在MMU中被映射为无效以进行读取或写入。在这种情况下,strcmp
正在尝试访问第0页,因为您传递了一个NULL ptr。 Null Ptr为地址零,页面0为无效页面。
对文件的引用:
../sysdeps/x86_64/multiarch/strcmp-sse2-unaligned.S
指的是在64位体系结构上为x86实现strcmp的汇编程序文件(.S)。由于您的系统上没有该实现文件,因此gdb抱怨它无法访问它。