2013-07-11 93 views
2

是否有可能與gdb運行過程中,修改一些記憶,然後從過程之後detach使用gdb和運行過程中其分離

如我需要修改存儲器,執行第一指令之前,我無法啓動從gdb以外的處理。

當您從gdb開始的進程detach,gdb將掛起,但從另一進程中kill 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) 
+0

什麼?你正在使用'6.3'?那是近十年前發佈的。 – devnull

+0

@devnull這是Apple發佈的最新版本,其中包括OS X的相關功能。由於Apple傾向於使用'llvm + clang'而不使用'gcc',因此他們會比'gdb'更喜歡'lldb'。 – Tyilo

+0

爲什麼你需要分離?爲什麼不讓gdb運行? –

回答

4

我敢肯定,你不能脫離這是直接gdb下開始較差的過程,但是,像下面爲你可能的工作,這是基於最近的gdb,我不知道有多少,這將在6.3版本。

創建一個小的shell腳本,像這樣:

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

現在開始這件事,從echo $$現貨PID,以及連接到這樣gdb -p PID shell腳本。一旦連接,您可以:

(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應當恢復(或在這種情況下開始)運行。