我正在执行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”失败了。我想了解在这种情况下何时会发生这种情况。

最佳答案

您的函数在myfile.c:1102处执行了一些操作。反过来,这会欺骗标准库,使其非法访问内存。操作系统会使用sigsegv注意到并拍打您的程序。

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

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

  • 长长的函数列表显示了谁执行了此操作。所以:
  • 称为my_functionsnprintf
  • 称为__vfprintf
  • ...
  • 关于c - 了解分段故障的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6726132/

    10-10 08:00