了解分段故障的堆栈跟踪

时间:2011-07-17 19:14:15

标签: c gdb segmentation-fault crash-dumps core-file

我正在做一个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

在seg故障的情况下我多次看到这样的堆栈,但从未正确理解。

只是看看跟踪中的电话,我们可以告诉出现什么问题吗?

注意:请不要索取更多代码。我的动机是简单地理解这样的堆栈跟踪意味着什么 - 无论代码如何。我看到顶部的“memcpy”失败了。我想知道在这种情况下何时会发生这种情况。

3 个答案:

答案 0 :(得分:7)

你的职能是在myfile.c:1102做某事。这又反过来欺骗标准库非法访问内存。操作系统会通过sigsegv通知并删除您的程序。

常见的原因,(见Stackoverflow :)))是:

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

很长的功能列表显示了谁做到了。所以:

  • my_function名为snprintf
  • 调用了__vfprintf
  • ...

答案 1 :(得分:2)

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

答案 2 :(得分:1)

这只是一连串的电话。程序中的第一个函数调用将 出现在底部,通常是main以及随后对其他人的调用 函数(来自 main 内部)将出现在它的顶部。如果新呼叫呼叫 另一个子程序(函数),它堆叠在顶部,然后继续进行。

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