[英]How can I use the output of a shell command as an argument to GDB command within GDB?
我不想花時間搜索我要附加的流程的PID,所以我做了這樣的事情,
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中有類似的東西嗎?
GDB 附加命令需要進程ID作為參數。 因此,您無法直接實現它。 您可以分兩個步驟進行操作:
(gdb) shell pidof foo
12345
(gdb) attach 12345
Attaching to process 12345
...
但是gdb非常靈活,可以用內部腳本(稱為命令序列),python等進行擴展 。這是一個示例腳本,它還可以處理找不到進程或找到多個進程時的情況(由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 $ {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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.