2016-03-15 66 views
2

我不想花時間尋找我要附加到進程的PID,所以我做這樣的事情,如何在GDB中使用shell命令的輸出作爲GDB命令的參數?

gdb -p ($pidof foo) 

其中foo是進程名。

我想知道我是否可以在GDB中這樣做。

我正在尋找類似以下的東西。

(gdb) attach $(pidof foo) 
Illegal process-id: $(pidof foo). 
(gdb) attach `pidof foo` 
Illegal process-id: `pidof foo`. 

在GDB中有這樣的事嗎?

+0

看來,這並不簡單,但可能有一個黑客在這裏解釋:http://stackoverflow.com/questions/ 6885923/redirecting-storage-output-of-shell-into-gdb-variable – dbrank0

+0

@ dbrank0很棒,根據你的想法寫出了罐裝seq(看我的回答) – pmod

回答

3

Gdb 附加命令需要進程ID作爲參數。所以,你不能直接實現它。你可以做的兩個步驟:

(gdb) shell pidof foo 
12345 
(gdb) attach 12345 
Attaching to process 12345 
... 

但是GDB是相當靈活,可以與extended內部腳本(稱爲命令的罐頭序列),蟒蛇等,下面是一個示例腳本,也負責處理的情況時沒有發現過程中發現時或幾個進程(第一通過的pidof給出被選擇):

define attach_pidof 
    if $argc != 1 
    help attach_pidof 
    else 
    shell echo -e "\ 
set \$PID = "$(echo $(pidof $arg0) 0 | cut -d ' ' -f 1)"\n\ 
if \$PID > 0\n\ 
    attach "$(pidof -s $arg0)"\n\ 
else\n\ 
    print \"Process '"$arg0"' not found\"\n\ 
end" > /tmp/gdb.pidof 
    source /tmp/gdb.pidof 
    end 
end 
document attach_pidof 
Attach to process by name. 
Usage: attach_pidof PROG_NAME 
end 

在這裏,我使用特技指出由@ dbrank0(echo'ing到文件,然後與源運行它)。此外,我使用echo $(pidof <>)0在未找到進程時提供默認值0。

廣場這〜/ .gdbinit等GDB啓動,該命令將被自動添加到GDB,可用於:

(gdb) attach_pidof myprog 

如果你的GDB支持Python擴展,你可以把這個給一些文件,例如ext.py

import gdb 
from subprocess import check_output, CalledProcessError 

class AttachPidofCommand (gdb.Command): 
    "Attach to process by name" 

    def __init__ (self): 
    super (AttachPidofCommand, self).__init__ ("attach_pidof", 
         gdb.COMMAND_SUPPORT, 
         gdb.COMPLETE_NONE, True) 

    def invoke (self, arg, from_tty): 
    try: 
     pid = check_output(["pidof", arg]).split()[0].decode("utf-8") 
    except CalledProcessError: 
     gdb.write('process \'%s\' not found\n' % (arg)) 
     return 
    gdb.write('attach to \'%s\' (%s)\n' % (arg, pid)) 
    gdb.execute('attach %s' % (pid), from_tty) 

AttachPidofCommand() 

進口並使用相同的方法:

(gdb) source ext.py 
(gdb) attach_pidof my_prog