了解分段故障的堆栈跟踪

har*_*ari 5 c gdb crash-dumps segmentation-fault 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

cni*_*tar 7

你的功能在做什么myfile.c:1102.这又反过来欺骗标准库非法访问内存.操作系统注意到并使用了程序sigsegv.

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

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

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

  • my_functionsnprintf
  • 哪个叫 __vfprintf
  • ...