回答
「b _start
」或「b start
」可能會,也可能無法正常工作。如果沒有,請使用readelf/objdump找到入口點地址,並使用「b *0x<hex address>
」。
奇怪的是它在頭文件中指定的入口點處打破並且反彙編看起來不錯,但對可執行文件的直接反彙編顯示垃圾。但你回答了這個問題。 ;)順便說一句,很榮幸能從Hex-Rays的一個人那裏得到答案! – rickythefox
''cru'/init-first.c'中的'_init'似乎甚至在'_start'或GCC 4.8 glibc中的入口地址之前運行2.19 Ubuntu 14.04當我嘗試'b _init;在GDB中運行。到底是怎麼回事? –
提問在:http://stackoverflow.com/questions/31379422/why-is-init-from-glibcs-csu-init-first-c-called-before-start-even-if-start-i –
在將可執行文件加載到gdb之後,如何在執行第一條指令之前在入口點處中斷?
你可以找到int main()
與set backtrace past-main on
之前叫什麼功能,並找到他們之後對其設置一個斷點,然後重新啓動程序:
>gdb -q main
Reading symbols from /home/main...done.
(gdb) set backtrace past-main on
(gdb) b main
Breakpoint 1 at 0x40058a: file main.cpp, line 25.
(gdb) r
Starting program: /home/main
Breakpoint 1, main() at main.cpp:25
25 a();
(gdb) bt
#0 main() at main.cpp:25
#1 0x0000003a1d81ed1d in __libc_start_main() from /lib64/libc.so.6
#2 0x0000000000400499 in _start()
(gdb) b _start
Breakpoint 2 at 0x400470
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/main
Breakpoint 2, 0x0000000000400470 in _start()
的沒有腦子的解決方案是使用副作用沒有設置斷點:
$ gdb /bin/true
Reading symbols from /bin/true...(no debugging symbols found)...done.
(gdb) b *0
Breakpoint 1 at 0x0
(gdb) r
Starting program: /bin/true
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x0
(gdb) disas
Dump of assembler code for function _start:
=> 0xf7fdd800 <+0>: mov eax,esp
0xf7fdd802 <+2>: call 0xf7fe2160 <_dl_start>
End of assembler dump.
想法取自this answer at RE.SE。
從GDB 8.1開始,有一個特殊的命令:starti
。例如GDB會話:
$ gdb /bin/true
Reading symbols from /bin/true...(no debugging symbols found)...done.
(gdb) starti
Starting program: /bin/true
Program stopped.
0xf7fdd800 in _start() from /lib/ld-linux.so.2
(gdb) x/5i $pc
=> 0xf7fdd800 <_start>: mov eax,esp
0xf7fdd802 <_start+2>: call 0xf7fe2160 <_dl_start>
0xf7fdd807 <_dl_start_user>: mov edi,eax
0xf7fdd809 <_dl_start_user+2>: call 0xf7fdd7f0
0xf7fdd80e <_dl_start_user+7>: add ebx,0x1f7e6
- 1. GDB不停止在第一個帶有break _start或info文件的機器代碼指令入口點地址
- 2. 一個程序的機器碼指令
- 3. Angular 2 - 在第一個指令被渲染後停止渲染
- 4. NASM&GDB:失去第一條指令
- 5. 使用gdb計算機器指令
- 6. 如何防止GDB下一個命令後停止
- 7. 批處理文件在第一條命令後停止運行
- 8. 碼頭機器停止命令殺死我所有的容器
- 9. GDB指令指針
- 10. gdb不停止在斷點
- 11. 遠程gdb停止在每個事件
- 12. 命令處理器已停止工作
- 13. 爲什麼角度停止處理多個指令
- 14. {Makefile Error}「命令在第一個目標之前開始,停止。」
- 15. Makefile.in:12:***命令在第一個目標之前開始。停止
- 16. Jmeter XSD驗證在第一個錯誤處停止
- 17. 微指令從機器指令解碼後存儲在哪裏?
- 18. 停止在第一個錯誤
- 19. 停止在第一個字符匹配?
- 20. MIPS對機器代碼的指令
- 21. 在輸出的第一行停止FOR/F命令(Windows批處理)
- 22. 執行第一個命令後批處理文件停止執行
- 23. 如何在中間停止gdb用戶定義的命令?
- 24. 如何在exec()之後的新執行程序的第一條指令處停止子進程?
- 25. 停止機器人
- 26. 如何合併多個信號並在第一個下一個停止但不停止第一個錯誤?
- 27. 在第一個條件後停止執行代碼?
- 28. 當GDB中的斷點停止時,自動查看高級指令?
- 29. VSCode不會在斷點處停止時,第一個節點prcess叉第二
- 30. 碼頭停止命令GlassFish
對於'lldb',請參閱:[?如何停止執行後,調試器權(http://reverseengineering.stackexchange.com/q/9583/12021) – kenorb