让 gdb 在发生中断或发生崩溃时运行命令

Cha*_*les 3 scripting gdb accessible

我正在和一位盲人学生一起工作。她可以从命令行运行 gdb 来调试基于窗口的程序,但该程序从 gdb 获取焦点,因此如果命中断点或程序崩溃,屏幕阅读器不会读取 gdb 结果。理想情况下,当它获得 gdb 输出时,焦点是否会转到终端,但除此之外,是否有办法在 gdb 遇到断点或程序崩溃时运行 Linux 命令?然后我可以运行“espeak gdb”,她就会知道 gdb 需要获得焦点。

似乎应该有一种简单的方法可以使用 .gdbinit 中的脚本来完成此操作。

稍后编辑:

我发现你可以将此代码放入 .gdbinit 中:

python
import os
def stop_handler (event):
os.system("espeak gdb")

gdb.events.stop.connect (stop_handler)
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以安装stop 挂钩 hook-stop并使用shell后跟一个命令,以便在调试器停止时执行它,例如运行cmd(Windows),以便它在停止时从 shell 中回显一些字符串:

define hook-stop
    shell cmd /c echo "hello"
end
Run Code Online (Sandbox Code Playgroud)

替换cmd /c echo "hello"为您想要的命令,然后将其复制并粘贴到调试器中,现在当我的程序崩溃时:

#include <stdio.h>

int main(int argc, char **argv) {
  int *p = NULL;

  printf("%d\n", *p);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我应该看到“你好”:

> gdb -q a.exe
Reading symbols from a.exe...done.
(gdb) define hook-stop
Type commands for definition of "hook-stop".
End with a line saying just "end".
>    shell cmd /c echo "hello"
>end
(gdb) run
Starting program: a.exe
[New Thread 420.0x430]

Program received signal SIGSEGV, Segmentation fault.
"hello"
0x004013a6 in main ()
(gdb)
Run Code Online (Sandbox Code Playgroud)