使用gdb运行进程并将其分离

时间:2013-07-11 00:39:39

标签: gdb

是否可以使用gdb运行流程,然后修改一些内存,然后从流程中detach进行修改?

我无法在gdb之外启动进程,因为我需要在执行第一条指令之前修改内存。

当您从detach开始的流程gdb时,gdb会挂起,但从其他流程中删除gdb会使调试过程仍在运行。

我目前使用以下脚本启动该过程:

echo '# custom gdb function that finds the entry_point an assigns it to $entry_point_address
entry_point
b *$entry_point_address
run
set *((char *)0x100004147) = 0xEB
set *((char *)0x100004148) = 0xE2
detach # gdb hangs here
quit # quit never gets executed
' | gdb -quiet "$file"

我的gdb版本都会发生这种情况:

GNU gdb 6.3.50-20050815 (Apple version gdb-1824)
GNU gdb 6.3.50-20050815 (Apple version gdb-1822 + reverse.put.as patches v0.4)

1 个答案:

答案 0 :(得分:4)

我非常确定您无法脱离直接在gdb下启动的劣质流程,但是,以下内容可能对您有用,这是基于最近的gdb,我不知道这对版本6.3有多大作用。

创建一个小的shell脚本,如下所示:

#! /bin/sh
echo $$
sleep 10
exec /path/to/your/program arg1 arg2 arg3

现在启动它,从echo $$发现pid,并附加到shell脚本,如gdb -p PID。一旦附上,您可以:

(gdb) set follow-fork-mode child
(gdb) catch exec
(gdb) continue
Continuing.
[New process NEW-PID]
process NEW-PID is executing new program: /path/to/your/program
[Switching to process NEW-PID]

Catchpoint 1 (exec'd /path/to/your/program), 0x00007f40d8e9fc80 in _start ()
(gdb)

您现在可以根据需要修改子进程。完成后,请执行以下操作:

(gdb) detach

/path/to/your/program应该恢复(或在这种情况下开始)运行。