6

我正在做一个snprintf并得到一个段错误。

当我像这样在 gdb 上加载核心文件时gdb my_executable core:并确实bt获得了回溯,我得到了以下信息:

Program terminated with signal 11, Segmentation fault.
#0  0x88207fc2 in memcpy () from /usr/lib/libc.so.6
(gdb) bt
#0  0x88207fc2 in memcpy () from /usr/lib/libc.so.6
#1  0x88205eb6 in __sfvwrite () from /usr/lib/libc.so.6
#2  0x881fbc95 in strchr () from /usr/lib/libc.so.6
#3  0xbfbe6c14 in ?? ()
#4  0xbfbe69d8 in ?? ()
#5  0x881ed91e in localeconv () from /usr/lib/libc.so.6
#6  0x881fec05 in __vfprintf () from /usr/lib/libc.so.6
#7  0x881f7d80 in snprintf () from /usr/lib/libc.so.6  
#8  0x08052b64 in my_function (files=0xbfbed710, filename=<value optimized out>) at myfile.c:1102
#9  0x08053bfb in main (argc=4, argv=0xbfbedd90) at myfile.c:225

在出现段错误的情况下,我多次看到这样的堆栈,但从未正确理解。

只需查看跟踪中的调用,我们就能知道出了什么问题吗?

注意:请不要要求更多代码。我的动机只是理解这样的堆栈跟踪意味着什么——不管代码如何。我看到顶部的“memcpy”失败了。我想了解在这种情况下何时会发生这种情况。

4

3 回答 3

7

你的功能在myfile.c:1102. 这反过来又诱使标准库非法访问内存。操作系统会通知您的程序并使用sigsegv.

常见的原因,(如在 Stackoverflow 上看到的 :)))是:

  • 写入只读存储器
  • 使用未初始化的指针
  • 访问已分配块末尾之后的内存

长长的函数列表告诉你是谁做的。所以:

  • my_functionsnprintf
  • 这叫__vfprintf
  • ...
于 2011-07-17T19:17:08.163 回答
2

我建议你在 Valgrind 下运行你的可执行文件。如果您的代码出现问题(例如使用已释放的内存),它可能会输出附加调用跟踪。这通常有助于了解崩溃的原因。

于 2011-07-18T07:50:29.437 回答
1

这只是电话的痕迹。程序中的第一个函数调用将出现在底部,通常会出现main,随后对其他函数的调用(从main内部)将出现在它的顶部。如果新的调用调用另一个子例程(函数),它会堆叠在顶部并且过程继续。

GDB 打印一些有用的信息,考虑到它是可用的。第一列是堆栈位置(上下)。第二列包含调用地址,其余信息包含被调用函数的名称和位置。请注意,这些变化很大。有时,符号的名称无法检索,并且?? ()会在堆栈跟踪中显示为 #3 和 #4。当源可用时,定义函数的行也会出现,如at myfile.c:225.

于 2011-07-17T19:22:53.670 回答