2012-11-30 2 views
2

복잡한 프로그램에서 스택 스매싱 오류가 발생하여 아래에 붙여 넣습니다. 나는 그것이 일어나는 곳을 찾아내는 데 어려움을 겪고있다. printf-debugging을 사용하여 함수를 찾고, 실제로 함수가 리턴 될 때 검사가 일어난다는 사실을 알아 냈습니다 (printf가 반환되기 바로 전에 함수 호출이 끝난 직후).스택 스매싱 오류 코드 위반을 감지하는 방법

그러나 거대한 기능입니다. 나는 그것을 모두 읽었지만 스택 오버 플로우 기회를 발견하지 못했습니다. 따라서 버그가있는 곳을 더 정확하게 예측해야합니다. 어떻게 디버깅 할 수 있습니까?

스택에 디버거 감시 점을 추가하여 감지 메모리를 스매싱 할 수 있다면 함수 반환 대신 스매싱 할 때 실행이 중단되는 것이 가장 쉽습니다. 그렇다면, 이것이 어떤 메모리인지 어떻게 알 수 있습니까?

소스를보고 싶은 사람들을 위해 Stack Overflow에서 스택 스매싱 질문을 살펴 보는 것이 좋습니다. 만약 내가 정말로 사용하고있는 코드를보고 싶다면 freedink 소스를 얻는다. (문제가되는 함수는 updateFrame이다.) gcc가-패치 목록에서

업데이트,이 문제는 비록 결론에 도달하지 않는 것 같습니다 2009 년 discussed했다. 적어도 내가 GDB에서 "info locals"라고 말할 때 어떤 이름도 나오지 않는다. (그 스레드의 어딘가에 있음). 누군가가 이것을 어떻게 찾아야 하는지를 말해 줄 수 있다면 (제게는 일종의 거절 된 것입니다), 제 질문에 답할 수있을 것입니다.

다음 업데이트는

좋아, 검색을 많이 후, 나는 전혀 예상치 못한 뭔가를 발견했다. 스택 백 트레이스에서 알 수 있듯이 libSDL 함수를 종료 할 때 스택 스매싱이 감지됩니다. 이제는 일반적으로 SDL 함수가 잘 작동하고 freedink에는 버그가 가득합니다. 그래서 SDL에서 버그를 쳤을 수도 있다고 생각조차하지 않았습니다. 그러나 그것은 내가 한 것 같습니다. 미디 파일을 재생하려고합니다. 다른 장소에 다른 MIDI 파일을 복사하면 프로그램이 정상적으로 작동합니다.

그래서 내 현재의 문제는 해결되었지만 내 질문에는 여전히 답이 없습니다. 스택 백 트레이스가 스택이 손상된 함수를 가리키고 있지만 (생각보다 유용하기 때문에) 가드의 주소를 제공하지 않으므로 (watchpoint 설정에 유용 할 수 있습니다).

*** 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)와 동적 (정제) 도구를 사용해 보셨습니까? 이들은 분명히 그들을 잡아야 만합니다 (atleast 대부분의 시간). –

+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 은 힙 배열에 대한 경계 검사 및 use-after-free 검사를 수행합니다. 또한 힙 또는 스택 할당에 의해 생성 된 초기화되지 않은 값 의 사용을 찾습니다. 그러나 스택 또는 글로벌 배열을 검사하는 범위 인 을 수행하지 않습니다.

SGCheck는 스택 또는 전역 배열에 대한 경계 검사를 수행하지만, 은 다른 작업을 수행하지 않습니다.

exp-sgcheck이 잠재적 오류를 찾는 방법에 대한 몇 가지주의 사항이 있으므로 시험하기 전에 문서를주의 깊게 읽으십시오.

편집 :

시도해 볼만한 또 다른 아이디어입니다. 함수 입력을 중단하면 함수가 종료 될 때까지 손상 될 주소를 결정할 수 있습니까? 아마도 스택 변수 또는 뭔가의 주소를 얻는가? 그렇다면 해당 주소에 gdb 감시 지점을 설정할 수 있습니다. gdb는이 메모리 위치가 수정 될 때마다 프로그램을 멈추게 할 것이다. 자주 수정되는 주소이지만 가난한 사람의 스택 가드 역할을 할 수 있다면 꽤 짜증나게됩니다. Here's a link to the docs.

특별한 스택 가드가있을 필요는 없지만 손상되었을 것으로 알고있는 스택을보아야합니다.

당신이 bar에 항목을 중단하고 watch j을 설정하면

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

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

당신은 루프 내부에 휴식 i == 20을 받아야 계속 예를 들어, 다음 프로그램을 제공. j이 함수 내에서 변경되어야한다면 이것은 분명히 꽤 성가시다. 주소가있는 경우 주소를 역 참조하여 볼 수 있습니다 watch *(int*)0x40051f. 그것은 그 소리와 함께 코드를 컴파일 할 수 있도록해야합니다 http://clang.llvm.org/docs/AddressSanitizer.html

하지만 아산 스택 스매싱 버그를 찾는 매우 좋다 :

+0

전에 SGCheck를 사용하지 않았지만 지금했습니다. 프로그램에서 두 가지 다른 버그를 발견했습니다. :-) 불행히도, stack trashing은 여전히 ​​해결되지 않습니다. –

+0

흠, 함수의 입력을 중단하면 결국 손상 될 정확한 주소를 결정할 수 있습니까? 아니면 적어도 경계? 만약 당신이 메모리에있는 그 위치에 gdb watch point를 설정할 수 있다면 gdb 프롬프트에서'help watch'를 사용해서 어떻게 사용 하는지를보십시오. – asm

+0

네, 그게 제가 원하는 것입니다. Gcc의 stack-protector에는이 목적을위한 변수가 있습니다. 어떻게 주소를 얻을 수 있는지 묻습니다. –

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); 
} 

어떻게 진행되는지 알려주십시오.

관련 문제