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
看來,這並不簡單,但可能有一個黑客在這裏解釋:http://stackoverflow.com/questions/ 6885923/redirecting-storage-output-of-shell-into-gdb-variable – dbrank0
@ dbrank0很棒,根據你的想法寫出了罐裝seq(看我的回答) – pmod