2012-11-30 47 views
2

在一个复杂的程序中,我遇到堆栈粉碎错误,粘贴在下面。我很难找到它发生的地方。我使用printf-debugging来定位函数,并且注意到检查实际上是在函数返回期间发生的(在返回执行之前的printf,紧接在函数调用之后的那个printf)。如何检测堆栈粉碎错误的问题代码

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

我认为如果我可以在堆栈粉碎检测内存中添加一个调试器观察点是最简单的,所以它在粉碎时而不是在函数返回时中断执行。如果是这样,我怎么知道这是什么内存?

对于那些想查看源代码的人,我建议您在Stack Overflow上查看堆栈粉碎问题。如果你真的想看到我使用的代码,请获取freedink源代码(违规函数是updateFrame)。

更新

在GCC-补丁列表中,这个问题是discussed在2009年它似乎并不虽然已经得出了一个结论。至少我没有看到任何名字出现时,我说gdb中的“信息当地人”(如在该线程中建议的地方)。如果有人可以告诉我如何找到这个__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 rw-p 0001b000 08:02 6422698 /lib/i386-linux-gnu/libgcc_s.so.1 
b0bea000-b0bec000 rw-p 00000000 00:00 0 
b0bec000-b0bed000 r--p 00000000 08:02 4361451 /usr/share/locale/nl/LC_MESSAGES/freedink.mo 
b0bed000-b0e69000 rw-p 00000000 00:00 0 
b0ea2000-b127f000 rw-p 00000000 00:00 0 
b12d7000-b12f0000 rw-p 00000000 00:00 0 
b130e000-b1330000 r--p 00000000 08:02 4348594 /usr/share/locale/nl/LC_MESSAGES/libc.mo 
b13a1000-b13dd000 rw-p 00000000 00:00 0 
b13fa000-b13fb000 ---p 00000000 00:00 0 
b13fb000-b1bfb000 rw-p 00000000 00:00 0 
b1bfb000-b1c05000 r--p 00000000 08:02 4355730 /usr/share/locale/nl/LC_MESSAGES/pulseaudio.mo 
b1c05000-b5c06000 rw-s 00000000 00:11 1297260 /run/shm/pulse-shm-3619928632 
b5c06000-b5c9f000 rw-p 00000000 00:00 0 
b5c9f000-b5dcb000 rw-s 00000000 00:04 1900555 /SYSV00000000 (deleted) 
b5dcb000-b5e22000 rw-p 00000000 00:00 0 
b5e35000-b5ecd000 rw-p 00000000 00:00 0 
b5ecd000-b5ed2000 r-xp 00000000 08:02 4332397 /usr/lib/i386-linux-gnu/libXfixes.so.3.1.0 
b5ed2000-b5ed3000 rw-p 00004000 08:02 4332397 /usr/lib/i386-linux-gnu/libXfixes.so.3.1.0 
b5ed3000-b5edb000 r-xp 00000000 08:02 4342806 /usr/lib/i386-linux-gnu/libXrender.so.1.3.0 
b5edb000-b5edc000 rw-p 00008000 08:02 4342806 /usr/lib/i386-linux-gnu/libXrender.so.1.3.0 
b5edc000-b5ee5000 r-xp 00000000 08:02 4336027 /usr/lib/i386-linux-gnu/libXcursor.so.1.0.2 
b5ee5000-b5ee6000 rw-p 00009000 08:02 4336027 /usr/lib/i386-linux-gnu/libXcursor.so.1.0.2 
b5ee6000-b5ee7000 ---p 00000000 00:00 0 
b5ee7000-b66e7000 rw-p 00000000 00:00 0 
b66e7000-b685e000 r--p 00000000 08:02 4338396 /usr/lib/locale/locale-archive 
b685e000-b6862000 rw-p 00000000 00:00 0 
b6862000-b6872000 r-xp 00000000 08:02 6554164 /lib/i386-linux-gnu/i686/cmov/libresolv-2.13.so 
b6872000-b6873000 r--p 00010000 08:02 6554164 /lib/i386-linux-gnu/i686/cmov/libresolv-2.13.so 
b6873000-b6874000 rw-p 00011000 08:02 6554164 /lib/i386-linux-gnu/i686/cmov/libresolv-2.13.so 
b6874000-b6876000 rw-p 00000000 00:00 0 
b6876000-b69dc000 r-xp 00000000 08:02 4327161 /usr/lib/i386-linux-gnu/libvorbisenc.so.2.0.8 
b69dc000-b69ed000 r--p 00165000 08:02 4327161 /usr/lib/i386-linux-gnu/libvorbisenc.so.2.0.8 
b69ed000-b69ee000 rw-p 00176000 08:02 4327161 /usr/lib/i386-linux-gnu/libvorbisenc.so.2.0.8 
b69ee000-b69ef000 rw-p 00000000 00:00 0 
b69ef000-b6a02000 r-xp 00000000 08:02 6554172 /lib/i386-linux-gnu/i686/cmov/libnsl-2.13.so 
b6a02000-b6a03000 r--p 00012000 08:02 6554172 /lib/i386-linux-gnu/i686/cmov/libnsl-2.13.so 
b6a03000-b6a04000 rw-p 00013000 08:02 6554172 /lib/i386-linux-gnu/i686/cmov/libnsl-2.13.so 
b6a04000-b6a06000 rw-p 00000000 00:00 0 
b6a06000-b6a14000 r-xp 00000000 08:02 4334619 /usr/lib/i386-linux-gnu/libXi.so.6.1.0 
b6a14000-b6a15000 rw-p 0000d000 08:02 4334619 /usr/lib/i386-linux-gnu/libXi.so.6.1.0 
b6a15000-b6a19000 r-xp 00000000 08:02 6422575 /lib/i386-linux-gnu/libuuid.so.1.3.0 
b6a19000-b6a1a000 r--p 00003000 08:02 6422575 /lib/i386-linux-gnu/libuuid.so.1.3.0 
b6a1a000-b6a1b000 rw-p 00004000 08:02 6422575 /lib/i386-linux-gnu/libuuid.so.1.3.0 
b6a1b000-b6a20000 r-xp 00000000 08:02 4331837 /usr/lib/i386-linux-gnu/libXdmcp.so.6.0.0 
b6a20000-b6a21000 rw-p 00004000 08:02 4331837 /usr/lib/i386-linux-gnu/libXdmcp.so.6.0.0 
b6a21000-b6a23000 r-xp 00000000 08:02 4330387 /usr/lib/i386-linux-gnu/libXau.so.6.0.0 
b6a23000-b6a24000 rw-p 00001000 08:02 4330387 /usr/lib/i386-linux-gnu/libXau.so.6.0.0 
b6a24000-b6a25000 rw-p 00000000 00:00 0 
b6a25000-b6a29000 r-xp 00000000 08:02 6423604 /lib/i386-linux-gnu/libattr.so.1.1.0 
b6a29000-b6a2a000 r--p 00003000 08:02 6423604 /lib/i386-linux-gnu/libattr.so.1.1.0 
b6a2a000-b6a2b000 rw-p 00004000 08:02 6423604 /lib/i386-linux-gnu/libattr.so.1.1.0 
b6a2b000-b6a30000 r-xp 00000000 08:02 4331630 /usr/lib/i386-linux-gnu/libasyncns.so.0.3.1 
b6a30000-b6a31000 rw-p 00004000 08:02 4331630 /usr/lib/i386-linux-gnu/libasyncns.so.0.3.1 
b6a31000-b6a9e000 r-xp 00000000 08:02 4375323 /usr/lib/i386-linux-gnu/libsndfile.so.1.0.25 
b6a9e000-b6aa0000 r--p 0006c000 08:02 4375323 /usr/lib/i386-linux-gnu/libsndfile.so.1.0.25 
b6aa0000-b6aa1000 rw-p 0006e000 08:02 4375323 /usr/lib/i386-linux-gnu/libsndfile.so.1.0.25 
b6aa1000-b6aa5000 rw-p 00000000 00:00 0 
b6aa5000-b6aad000 r-xp 00000000 08:02 6422615 /lib/i386-linux-gnu/libwrap.so.0.7.6 
b6aad000-b6aae000 r--p 00007000 08:02 6422615 /lib/i386-linux-gnu/libwrap.so.0.7.6 
b6aae000-b6aaf000 rw-p 00008000 08:02 6422615 /lib/i386-linux-gnu/libwrap.so.0.7.6 
b6aaf000-b6ab4000 r-xp 00000000 08:02 4331851 /usr/lib/i386-linux-gnu/libXtst.so.6.1.0 
b6ab4000-b6ab5000 rw-p 00004000 08:02 4331851 /usr/lib/i386-linux-gnu/libXtst.so.6.1.0 
b6ab5000-b6ab6000 rw-p 00000000 00:00 0 
b6ab6000-b6abd000 r-xp 00000000 08:02 4332239 /usr/lib/i386-linux-gnu/libSM.so.6.0.1 
b6abd000-b6abe000 rw-p 00006000 08:02 4332239 /usr/lib/i386-linux-gnu/libSM.so.6.0.1 
b6abe000-b6ad4000 r-xp 00000000 08:02 4332225 /usr/lib/i386-linux-gnu/libICE.so.6.3.0 
b6ad4000-b6ad6000 rw-p 00015000 08:02 4332225 /usr/lib/i386-linux-gnu/libICE.so.6.3.0 
b6ad6000-b6ad7000 rw-p 00000000 00:00 0 
b6ad7000-b6ad8000 r-xp 00000000 08:02 4326690 /usr/lib/i386-linux-gnu/libX11-xcb.so.1.0.0 
b6ad8000-b6ad9000 rw-p 00000000 08:02 4326690 /usr/lib/i386-linux-gnu/libX11-xcb.so.1.0.0 
b6ad9000-b6af6000 r-xp 00000000 08:02 6423599 /lib/i386-linux-gnu/libtinfo.so.5.9 
b6af6000-b6af8000 r--p 0001c000 08:02 6423599 /lib/i386-linux-gnu/libtinfo.so.5.9 
b6af8000-b6af9000 rw-p 0001e000 08:02 6423599 /lib/i386-linux-gnu/libtinfo.so.5.9 
b6af9000-b6b2a000 r-xp 00000000 08:02 6423581 /lib/i386-linux-gnu/libncursesw.so.5.9 
b6b2a000-b6b2b000 r--p 00030000 08:02 6423581 /lib/i386-linux-gnu/libncursesw.so.5.9 
b6b2b000-b6b2c000 rw-p 00031000 08:02 6423581 /lib/i386-linux-gnu/libncursesw.so.5.9 
b6b2c000-b6b2d000 rw-p 00000000 00:00 0 
b6b2d000-b6c15000 r-xp 00000000 08:02 6423605 /lib/i386-linux-gnu/libslang.so.2.2.4 
b6c15000-b6c17000 r--p 000e8000 08:02 6423605 /lib/i386-linux-gnu/libslang.so.2.2.4 
b6c17000-b6c26000 rw-p 000ea000 08:02 6423605 /lib/i386-linux-gnu/libslang.so.2.2.4 
b6c26000-b6c60000 rw-p 00000000 00:00 0 
b6c60000-b6c81000 r-xp 00000000 08:02 4331073 /usr/lib/i386-linux-gnu/libxcb.so.1.1.0 
b6c81000-b6c82000 r--p 00020000 08:02 4331073 /usr/lib/i386-linux-gnu/libxcb.so.1.1.0 
b6c82000-b6c83000 rw-p 00021000 08:02 4331073 /usr/lib/i386-linux-gnu/libxcb.so.1.1.0 
b6c83000-b6ccc000 r-xp 00000000 08:02 6422562 /lib/i386-linux-gnu/libdbus-1.so.3.7.2 
b6ccc000-b6ccd000 ---p 00049000 08:02 6422562 /lib/i386-linux-gnu/libdbus-1.so.3.7.2 
b6ccd000-b6cce000 r--p 00049000 08:02 6422562 /lib/i386-linux-gnu/libdbus-1.so.3.7.2 
b6cce000-b6ccf000 rw-p 0004a000 08:02 6422562 /lib/i386-linux-gnu/libdbus-1.so.3.7.2 
b6ccf000-b6cd7000 r-xp 00000000 08:02 4327592 /usr/lib/i386-linux-gnu/libjson.so.0.1.0 
b6cd7000-b6cd8000 r--p 00007000 08:02 4327592 /usr/lib/i386-linux-gnu/libjson.so.0.1.0 
b6cd8000-b6cd9000 rw-p 00008000 08:02 4327592 /usr/lib/i386-linux-gnu/libjson.so.0.1.0 
b6cd9000-b6cdd000 r-xp 00000000 08:02 6423193 /lib/i386-linux-gnu/libcap.so.2.22 
b6cdd000-b6cde000 rw-p 00003000 08:02 6423193 /lib/i386-linux-gnu/libcap.so.2.22 
b6cde000-b6cdf000 rw-p 00000000 00:00 0 
b6cdf000-b6d45000 r-xp 00000000 08:02 4339765 /usr/lib/i386-linux-gnu/pulseaudio/libpulsecommon-2.0.so 
b6d45000-b6d46000 r--p 00065000 08:02 4339765 /usr/lib/i386-linux-gnu/pulseaudio/libpulsecommon-2.0.so 
b6d46000-b6d47000 rw-p 00066000 08:02 4339765 /usr/lib/i386-linux-gnu/pulseaudio/libpulsecommon-2.0.so 
b6d47000-b6d4e000 r-xp 00000000 08:02 6554189 /lib/i386-linux-gnu/i686/cmov/librt-2.13.so 
b6d4e000-b6d4f000 r--p 00006000 08:02 6554189 /lib/i386-linux-gnu/i686/cmov/librt-2.13.so 
b6d4f000-b6d50000 rw-p 00007000 08:02 6554189 /lib/i386-linux-gnu/i686/cmov/librt-2.13.so 
b6d50000-b6d5b000 r-xp 00000000 08:02 4330586 /usr/lib/i386-linux-gnu/libjbig.so.0.0.0 
b6d5b000-b6d5e000 rw-p 0000b000 08:02 4330586 /usr/lib/i386-linux-gnu/libjbig.so.0.0.0 
b6d5e000-b6d64000 r-xp 00000000 08:02 4333085 /usr/lib/i386-linux-gnu/libogg.so.0.8.0 
b6d64000-b6d65000 rw-p 00005000 08:02 4333085 /usr/lib/i386-linux-gnu/libogg.so.0.8.0 
b6d65000-b6d66000 rw-p 00000000 00:00 0 
b6d66000-b6d8c000 r-xp 00000000 08:02 6426268 /lib/i386-linux-gnu/libexpat.so.1.6.0 
b6d8c000-b6d8d000 ---p 00026000 08:02 6426268 /lib/i386-linux-gnu/libexpat.so.1.6.0 
b6d8d000-b6d8f000 r--p 00026000 08:02 6426268 /lib/i386-linux-gnu/libexpat.so.1.6.0 
b6d8f000-b6d90000 rw-p 00028000 08:02 6426268 /lib/i386-linux-gnu/libexpat.so.1.6.0 
b6d90000-b6da5000 r-xp 00000000 08:02 6553829 /lib/i386-linux-gnu/i686/cmov/libpthread-2.13.so 
b6da5000-b6da6000 r--p 00014000 08:02 6553829 /lib/i386-linux-gnu/i686/cmov/libpthread-2.13.so 
b6da6000-b6da7000 rw-p 00015000 08:02 6553829 /lib/i386-linux-gnu/i686/cmov/libpthread-2.13.so 
b6da7000-b6da9000 rw-p 00000000 00:00 0 
b6da9000-b6dab000 r-xp 00000000 08:02 4338554 /usr/lib/i386-linux-gnu/libts-0.0.so.0.1.1 
b6dab000-b6dac000 rw-p 00001000 08:02 4338554 /usr/lib/i386-linux-gnu/libts-0.0.so.0.1.1 
b6dac000-b6e73000 r-xp 00000000 08:02 4326574 /usr/lib/i386-linux-gnu/libcaca.so.0.99.18 
b6e73000-b6e74000 rw-p 000c6000 08:02 4326574 /usr/lib/i386-linux-gnu/libcaca.so.0.99.18 
b6e74000-b6e79000 rw-p 00000000 00:00 0 
b6e79000-b6e8f000 r-xp 00000000 08:02 4353038 /usr/lib/i386-linux-gnu/libdirect-1.2.so.9.0.1 
b6e8f000-b6e90000 rw-p 00016000 08:02 4353038 /usr/lib/i386-linux-gnu/libdirect-1.2.so.9.0.1 
b6e90000-b6e91000 rw-p 00000000 00:00 0 
b6e91000-b6e9a000 r-xp 00000000 08:02 4353034 /usr/lib/i386-linux-gnu/libfusion-1.2.so.9.0.1 
b6e9a000-b6e9b000 rw-p 00008000 08:02 4353034 /usr/lib/i386-linux-gnu/libfusion-1.2.so.9.0.1 
b6e9b000-b6f1e000 r-xp 00000000 08:02 4353040 /usr/lib/i386-linux-gnu/libdirectfb-1.2.so.9.0.1 
b6f1e000-b6f21000 rw-p 00082000 08:02 4353040 /usr/lib/i386-linux-gnu/libdirectfb-1.2.so.9.0.1 
b6f21000-b6f32000 r-xp 00000000 08:02 4325458 /usr/lib/i386-linux-gnu/libXext.so.6.4.0 
b6f32000-b6f33000 rw-p 00010000 08:02 4325458 /usr/lib/i386-linux-gnu/libXext.so.6.4.0 
b6f33000-b7067000 r-xp 00000000 08:02 4327567 /usr/lib/i386-linux-gnu/libX11.so.6.3.0 
b7067000-b706b000 rw-p 00133000 08:02 4327567 /usr/lib/i386-linux-gnu/libX11.so.6.3.0 
b706b000-b70b9000 r-xp 00000000 08:02 4339764 /usr/lib/i386-linux-gnu/libpulse.so.0.14.2 
b70b9000-b70ba000 r--p 0004d000 08:02 4339764 /usr/lib/i386-linux-gnu/libpulse.so.0.14.2 
b70ba000-b70bb000 rw-p 0004e000 08:02 4339764 /usr/lib/i386-linux-gnu/libpulse.so.0.14.2 
b70bb000-b70bc000 rw-p 00000000 00:00 0 
b70bc000-b70bf000 r-xp 00000000 08:02 4330214 /usr/lib/i386-linux-gnu/libpulse-simple.so.0.0.3 
b70bf000-b70c0000 r--p 00002000 08:02 4330214 /usr/lib/i386-linux-gnu/libpulse-simple.so.0.0.3 
b70c0000-b70c1000 rw-p 00003000 08:02 4330214 /usr/lib/i386-linux-gnu/libpulse-simple.so.0.0.3 
b70c1000-b71b4000 r-xp 00000000 08:02 4328460 /usr/lib/i386-linux-gnu/libasound.so.2.0.0 
b71b4000-b71b8000 r--p 000f2000 08:02 4328460 /usr/lib/i386-linux-gnu/libasound.so.2.0.0 
b71b8000-b71b9000 rw-p 000f6000 08:02 4328460 /usr/lib/i386-linux-gnu/libasound.so.2.0.0 
b71b9000-b7250000 r-xp 00000000 08:02 4330930 /usr/lib/i386-linux-gnu/libfreetype.so.6.8.1 
b7250000-b7254000 r--p 00096000 08:02 4330930 /usr/lib/i386-linux-gnu/libfreetype.so.6.8.1 
b7254000-b7255000 rw-p 0009a000 08:02 4330930 /usr/lib/i386-linux-gnu/libfreetype.so.6.8.1 
b7255000-b7283000 r-xp 00000000 08:02 4327431 /usr/lib/i386-linux-gnu/libwebp.so.2.0.0 
b7283000-b7284000 r--p 0002d000 08:02 4327431 /usr/lib/i386-linux-gnu/libwebp.so.2.0.0 
b7284000-b7285000 rw-p 0002e000 08:02 4327431 /usr/lib/i386-linux-gnu/libwebp.so.2.0.0 
b7285000-b7288000 rw-p 00000000 00:00 0 
b7288000-b729f000 r-xp 00000000 08:02 6422674 /lib/i386-linux-gnu/libz.so.1.2.7 
b729f000-b72a0000 r--p 00016000 08:02 6422674 /lib/i386-linux-gnu/libz.so.1.2.7 
b72a0000-b72a1000 rw-p 00017000 08:02 6422674 /lib/i386-linux-gnu/libz.so.1.2.7 
b72a1000-b72a2000 rw-p 00000000 00:00 0 
b72a2000-b7304000 r-xp 00000000 08:02 4328894 /usr/lib/i386-linux-gnu/libtiff.so.4.3.6 
b7304000-b7305000 ---p 00062000 08:02 4328894 /usr/lib/i386-linux-gnu/libtiff.so.4.3.6 
b7305000-b7307000 r--p 00062000 08:02 4328894 /usr/lib/i386-linux-gnu/libtiff.so.4.3.6 
b7307000-b7308000 rw-p 00064000 08:02 4328894 /usr/lib/i386-linux-gnu/libtiff.so.4.3.6 
b7308000-b7340000 r-xp 00000000 08:02 4325500 /usr/lib/i386-linux-gnu/libjpeg.so.8.4.0 
b7340000-b7341000 rw-p 00037000 08:02 4325500 /usr/lib/i386-linux-gnu/libjpeg.so.8.4.0 
b7341000-b7369000 r-xp 00000000 08:02 6422719 /lib/i386-linux-gnu/libpng12.so.0.49.0 
b7369000-b736a000 r--p 00027000 08:02 6422719 /lib/i386-linux-gnu/libpng12.so.0.49.0 
b736a000-b736b000 rw-p 00028000 08:02 6422719 /lib/i386-linux-gnu/libpng12.so.0.49.0 
b736b000-b7381000 r-xp 00000000 08:02 4334103 /usr/lib/libmad.so.0.2.1 
b7381000-b7382000 rw-p 00015000 08:02 4334103 /usr/lib/libmad.so.0.2.1 
b7382000-b73d0000 r-xp 00000000 08:02 4331056 /usr/lib/i386-linux-gnu/libFLAC.so.8.2.0 
b73d0000-b73d1000 r--p 0004d000 08:02 4331056 /usr/lib/i386-linux-gnu/libFLAC.so.8.2.0 
b73d1000-b73d2000 rw-p 0004e000 08:02 4331056 /usr/lib/i386-linux-gnu/libFLAC.so.8.2.0 
b73d2000-b73d3000 rw-p 00000000 00:00 0 
b73d3000-b73fd000 r-xp 00000000 08:02 4328031 /usr/lib/i386-linux-gnu/libvorbis.so.0.4.5 
b73fd000-b73fe000 r--p 00029000 08:02 4328031 /usr/lib/i386-linux-gnu/libvorbis.so.0.4.5 
b73fe000-b73ff000 rw-p 0002a000 08:02 4328031 /usr/lib/i386-linux-gnu/libvorbis.so.0.4.5 
b73ff000-b7407000 r-xp 00000000 08:02 4328022 /usr/lib/i386-linux-gnu/libvorbisfile.so.3.3.4 
+0

您是否尝试过静态工具(pclint)和动态(净化)工具?这些肯定会吸引他们(至少大部分时间)。 –

+0

到目前为止,我没有使用静态检查器(但是由于源代码的状态,我担心我会在警告中淹死)。我确实使用了valgrind(相当于净化,但是免费和开源),但它不会触发任何东西。 –

+1

您是否尝试过实验valgrind工具[exp-sgcheck](http://valgrind.org/docs/manual/sg-manual.html)或者只是memcheck?这听起来像sgcheck可能更适合你想要找的东西。 – asm

回答

2

你有用于Valgrind的的exp-sgcheck工具或只是MEMCHECK工具?这听起来像sgcheck可以做你想做的。从Valgrind文档:

SGCheck和Memcheck是互补的:它们的功能不重叠。 Memcheck 对堆阵列执行边界检查和释放后使用检查。它还可以找到 由堆或堆栈分配创建的未初始化值的用法。但它不执行检查堆栈或全局数组的边界 。另一方面,SGCheck确实会对堆栈或全局数组进行边界检查,但它不会执行任何其他操作。

关于exp-sgcheck如何发现潜在的错误(它被认为是实验性的),有一些注意事项,所以在试用之前仔细阅读这些文档。

编辑:

这是另一个尝试的想法。如果你在功能输入中断了,你可以确定一个地址在函数退出时会被破坏吗?也许通过获取堆栈变量的地址或者什么?如果是这样,您可以在该地址上设置gdb观察点。只要这个内存位置被修改,gdb就会停止程序。如果这是一个经常修改的地址,但这可能会非常恼人,但可以作为一名穷人的筹码后卫。 Here's a link to the docs

你不必有一个特殊的堆栈守卫,你只需要看看堆栈上的东西,你知道它会被损坏。例如,假设下面的程序:


void bar(int j) { 
    int *addr = (&j) - 20; 
    for(int i = 0; i <= 1000; i++) { 
     *(addr + i) = 0xDEADBEEF; 
    } 
} 

int main() { 
    bar(10); 
    return 0; 
} 

如果您在进入突破bar并设置watch j然后继续你应该得到一个内循环时i == 20休息。如果j应该在函数内部进行更改,这显然很烦人。如果你只有一个地址,你可以通过解除引用watch *(int*)0x40051f来观看。

+0

我之前没有使用SGCheck,但现在我做了。它在程序中捕获了另外两个错误。 :-)不幸的是,垃圾堆栈还没有解决。 –

+0

嗯,如果你打破了函数的入口,你能确定最终会被破坏的确切地址吗?或者至少是一个界限?如果是这样,你可以在内存中的该位置上设置gdb观察点,请参阅gdb提示符下的“help watch”以获取有关如何使用它的详细信息。 – asm

+0

是的,这正是我想要的。海湾合作委员会的堆栈保护器有一个变量为此目的,我问我如何得到的地址。 –

4

你可能想尝试这个简单的步骤。在两端用缓冲区填充堆栈,然后检查被覆盖的缓冲区的内容。通常,检查缓冲区的内容可以很好地了解问题出在哪里。

#include <stdio.h> 
#include <string.h> 

#define DEBUG   1 

/* 
* If stack is getting corrupted then this buf should change. 
* Looking at the contents of the buf should give a hint at 
* what is causing it. 
*/ 

#if DEBUG 

#define PAD_SIZE  1024 
#define PAD_CHAR  0xE5 

static void 
check_buf(char *name, char *s) 
{ 
    int j, count = 0; 

    for (j = 0; j < PAD_SIZE; j++) { 
     if ((unsigned char)*s != PAD_CHAR) { 
      count++; 
     } 
     s++; 
    } 

    if (count != 0) { 
     printf("%s corrupted by %d bytes\n", name, count); 
    } 
} 

#endif 

/* 
* Stack smashing happens when attempting to return from foo. 
*/ 

int 
foo(/* some calling args go here */) 
{ 
#if DEBUG 
    char pad_a[PAD_SIZE]; 
#endif 
    /* 
    * Rest of your ALL auto variables go here. 
    */ 
#if DEBUG 
    char pad_b[PAD_SIZE]; 

    memset(pad_a, PAD_CHAR, PAD_SIZE); 
    memset(pad_b, PAD_CHAR, PAD_SIZE); 
#endif 
    /* 
    * foo does its work and somehow ends up corrupting the 
    * stack. We normally learn about the problem when the 
    * function attempts to return. 
    */ 
#if DEBUG 
    check_buf("foo():pad_a", pad_a); 
    check_buf("foo():pad_b", pad_b); 
#endif 
    return(1); 
} 

让我们知道它是怎么回事。