linux gdb多参数,linux - 如何在GDB中将shell命令的输出用作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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值