我正在做一个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_function
called snprintf
- 这叫
__vfprintf
- ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)