2013-12-13 98 views
4

我不知道爲什麼我看不到這個回溯。加載我自己的二進制文件中的符號,並安裝包libc6-dbg。我需要告訴gdb在哪裏可以找到libc符號嗎?memcpy backtrace沒有符號可用

Program received signal SIGSEGV, Segmentation fault. 
__memcpy_ia32() at ../sysdeps/i386/i686/multiarch/../memcpy.S:74 
74 ../sysdeps/i386/i686/multiarch/../memcpy.S: No such file or directory. 
(gdb) bt full 
#0 __memcpy_ia32() at ../sysdeps/i386/i686/multiarch/../memcpy.S:74 
No locals. 
#1 0x00000000 in ??() 
No symbol table info available. 
(gdb) 
+0

很奇怪你沒有正確的背跡,你是用「-g -O0」選項建造的嗎?它可能是覆蓋返回地址的堆棧損壞? – jcm

+0

@jcm會對-O0有影響嗎? – jsj

+0

構建器可能通過修剪來自二進制文件的調試信息來優化您的應用程序。 「-O0」禁用優化並避免這種可能性。另一方面,從回溯行數來看,我敢打賭一堆堆損壞。我會嘗試添加一個答案來嘗試幫助解決這個問題。 – jcm

回答

1

從您的回溯,可能你已經被覆蓋您的返回地址(主要是因爲只有兩個呼叫並沒有關於代碼中調用的memcpy信息可用)堆棧損壞。是否有可能在堆棧中的地址上使用memcpy?檢查這種腐敗的

一種方式是通過使用watch GDB命令:

  1. 最重要的部分是劃定應該是腐敗的電話。在你的情況下應該是一個調用memcpy或接近它。
  2. 一旦你有可疑的功能,在它上面添加一個斷點。
  3. 運行直至達到轉折點。
  4. 通過以下方式將觀察點設置爲呼叫功能的地址:watch 0xXXXXXX
  5. 運行直至達到觀察點。

如果返回地址被覆蓋,數據庫應該停止損壞調用。