自动化GDB在特定断点处打印堆栈帧

时间:2013-07-16 09:24:12

标签: c gdb

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

我查看了thisthis但是没有提及是否可以将gdb附加到已经运行的进程(而不是让gdb启动它)。

我可以将gdb附加到PID上,但是我想自动运行它来运行bt,将输出存储在外部文件中然后运行continue。目前我手动执行此操作,每次遇到断点时都必须这样做。

2 个答案:

答案 0 :(得分:5)

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 >调用gdb。记住PID也用于运行过程。

第3步:根据需要放置断点。

步骤4:调用用户定义的命令callstack并传递无断点。

    gdb> callstack <No.of. Break Points> 

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

对于记录,我建议按照@ VoidPointer的回答。

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

适合我。 Reference

答案 1 :(得分:3)

如果你需要的是在知道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

为PID 6474和命令文件/root/.gdb_init

调用GDB
gdb -p 6474 -x /root/.gdb_init

在这里,fun_convert是打破的功能。这个br是实际的break gdb命令,你也可以使用br file.c:451在任何文件行中断。有关更多break选项,请查看gdb帮助。您可以在commandsend之间为相应的br添加所需的任何gdb命令。有关commands的更多信息,请在 gdb 上查看help commands

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