簡體   English   中英

如何在GDB中將shell命令的輸出用作GDB命令的參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM