11

是否可以将 gdb 附加到正在运行的进程的 PID 并且每次程序遇到特定断点时 gdb 将堆栈帧输出到外部文件?

我已经看过这个这个,但是没有提到是否可以将 gdb 附加到已经运行的进程(而不是让 gdb 启动它)。

否则我可以将 gdb 附加到 PID 就好了,但我想自动运行它bt,将输出存储在外部文件中,然后运行continue​​. 目前我正在手动执行此操作,每次遇到断点时我都必须这样做,这很痛苦。

4

2 回答 2

7
Is it possible to have gdb attached to the PID of a running process??

是的。可能的。

更新:

步骤1:

.gdbinit文件中添加以下命令,

define callstack
     set $Cnt = $arg0

     while($Cnt)
        commands $Cnt
        silent
        bt
        c
        end
        set $Cnt = $Cnt - 1
     end
end

第 2 步:使用-x <path to .gdbinit file >. 记住 PID 也用于运行进程。

第 3 步:在需要的地方放置断点。

第 4 步:调用用户定义的命令callstack并通过 no .of 断点。

    gdb> callstack <No.of. Break Points> 

第5步:现在给'c'继续。Bcos 进程已经在运行。

对于日志记录,我建议遵循@VoidPointer 的回答。

set pagination off
set logging file gdb.txt
set logging on 

为我工作。参考

于 2013-07-16T09:38:29.647 回答
5

如果您需要的是在知道 PID 和函数时使用 gdb 自动打印堆栈帧,那么您可以试试这个..(给定最少的代码才能正常工作)

/root/.gdb_init:

set pagination off
set logging file gdb.txt
set logging on

br fun_convert
# ^^ when breaking at function fun_convert, execute `commands` till next `end`
commands
    bt
    print "Sample print command 1 \n"
    continue
end

br file.c:451
# ^^ when breaking at line 451 of file.c, execute from `commands` till next `end`
commands
    bt
    print "Sample print command 2 \n"
    continue
end

continue

为 PID6474和命令文件调用 GDB /root/.gdb_init

gdb -p 6474 -x /root/.gdb_init

这里,fun_convert是打破的功能。这br是实际break的 gdb 命令,您也可以使用br file.c:451. 有关更多break选项,请查看 gdb 帮助。您可以在commandsend对应的br. 有关更多信息commands,请help commands查看gdb

注意:SO的JS在我的浏览器上坏了,请原谅任何错误并随时纠正。也无法添加评论:(

于 2013-07-16T09:48:33.980 回答