我试图在模块加载到gdb后立即停止。让我们假设二进制文件完全从所有符号信息中删除,因此没有主要的。
理想情况下,我会在入口点设置断点,但由于重定位,这个想法会中断:
(gdb) info target
Symbols from "./application".
Local exec file:
`./application', file type elf64-x86-64.
Entry point: 0xc154
...
(gdb) break *0xc154
Breakpoint 1 at 0xc154
(gdb) r
Starting program: ./application
Warning:
Cannot insert breakpoint 1.
Error accessing memory address 0xc154: Input/output error.
(gdb) info target
Symbols from "./application".
Unix child process:
Using the running image of child process 22835.
While running this, GDB does not access memory from...
Local exec file:
`./application', file type elf64-x86-64.
Entry point: 0x555555560154
即使这种工作方式(我可以在新地址上设置新断点并禁用原始地址),也无法通过gdb脚本/批处理模式轻松执行,因为它在中间有一条失败的指令。 / p>
有办法吗?理想情况下,“运行单指令”而不是“运行”会很有用。
答案 0 :(得分:10)
<强>更新强>
GDB-8.1实施了starti
命令,这非常容易。
入口点:0xc154
这是一个动态链接的,与位置无关的(PIE)二进制文件。
您希望在加载并重新定位该二进制文件之后但在执行任何操作之前停止在动态链接器中。
(gdb) set stop-on-solib-events 1
(gdb) run
Starting program: /tmp/a.out
Stopped due to shared library event (no libraries added or removed)
(gdb) info target
Symbols from "/tmp/a.out".
Unix child process:
Using the running image of child process 13746.
While running this, GDB does not access memory from...
Local exec file:
`/tmp/a.out', file type elf64-x86-64.
Entry point: 0x5555555545f0
...
(gdb) bt
#0 __GI__dl_debug_state () at dl-debug.c:77
#1 0x00007ffff7ddd488 in dl_main (phdr=<optimized out>, phnum=<optimized out>, user_entry=<optimized out>, auxv=0x7ffff7ffe870) at rtld.c:1678
#2 0x00007ffff7defb24 in _dl_sysdep_start (start_argptr=<optimized out>, dl_main=0x7ffff7ddc6e0 <dl_main>) at ../elf/dl-sysdep.c:244
#3 0x00007ffff7ddf365 in _dl_start_final (arg=0x7fffffffe440) at rtld.c:338
#4 _dl_start (arg=0x7fffffffe440) at rtld.c:564
#5 0x00007ffff7ddb6b8 in _start () from /lib64/ld-linux-x86-64.so.2