小编Bas*_*nen的帖子

如何检测有问题的代码来检查堆栈粉碎错误

在一个复杂的程序中,我遇到一个堆栈粉碎错误,粘贴在下面。我很难找出发生的地方。我使用printf-debugging定位了该函数,并注意到该检查实际上是在函数返回期间进行的(执行返回之前的printf,而不是执行函数调用之后的printf)。

然而,这是一个巨大的功能。我已经阅读了所有内容,但是没有注意到其中的任何堆栈溢出机会。因此,我需要更好地估计错误的位置。如何进一步调试?

我认为,如果我可以在堆栈粉碎检测内存上添加调试器监视点,那将是最简单的,因此它在粉碎时(而不是在函数返回时)中断执行。如果是这样,我怎么知道这是哪个内存?

对于那些想看源代码的人,我建议您在Stack Overflow上查看任何有关堆栈崩溃的问题。如果您真的想查看我正在使用的代码,请获取freedink源代码(有问题的功能为updateFrame)。

更新资料

在gcc补丁程序列表中,此问题已在2009 年进行了讨论。尽管如此,它似乎尚未得出结论。至少当我在gdb中说“ info locals”时(在该线程的某处建议),我看不出任何名字。如果有人可以告诉我如何找到它__stack_guard__(那是行不通的,因为它被拒绝了),那将回答我的问题。

下次更新

好的,经过大量搜索,我发现了一些完全出乎意料的事情。从堆栈回溯中可以看到,退出libSDL函数时会检测到堆栈崩溃。现在,通常SDL函数可以正常工作,并且freedink充满了错误。因此,我什至不认为我会遇到SDL中的错误。但是,看来我做到了。它正在尝试播放midi文件。如果我将另一个midi文件复制到其位置,则该程序可以正常运行。

这样我的当前问题就解决了,但是我的问题仍然没有得到回答。尽管堆栈回溯确实指向了将堆栈粉碎的函数(因此它比我想象的要有用),但它没有提供用于保护的地址,这也可能有用(用于设置观察点)。

*** stack smashing detected ***: freedink terminated
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(__fortify_fail+0x50)[0xb754c3f0]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0xea39a)[0xb754c39a]
/usr/lib/i386-linux-gnu/libSDL_mixer-1.2.so.0(+0x1c524)[0xb771f524]
/usr/lib/i386-linux-gnu/libSDL_mixer-1.2.so.0(+0x17443)[0xb771a443]
======= Memory map: ========
08048000-0808b000 r-xp 00000000 08:02 4333161    /usr/games/freedink
0808b000-0808c000 rw-p 00042000 08:02 4333161    /usr/games/freedink
0808c000-0841d000 rw-p 00000000 00:00 0
09fa9000-0b2de000 rw-p 00000000 00:00 0          [heap]
afda8000-b09e5000 rw-p 00000000 00:00 0
b0a00000-b0a21000 rw-p 00000000 00:00 0
b0a21000-b0b00000 ---p 00000000 00:00 0
b0ba7000-b0bc3000 r-xp 00000000 08:02 6422698    /lib/i386-linux-gnu/libgcc_s.so.1
b0bc3000-b0bc4000 …
Run Code Online (Sandbox Code Playgroud)

c debugging stack gdb watchpoint

4
推荐指数
2
解决办法
7356
查看次数

标签 统计

c ×1

debugging ×1

gdb ×1

stack ×1

watchpoint ×1