好在可以通过Linux的作业管理机制,通过ctrl + z把当前任务挂起,返回终端做其他事情。通过jobs命令可以查看当前shell有哪些任务。比如,当我暂停GDB时,jobs显示我的VIM编辑器进程与GDB目前都处于挂起状态。
以下是些相关的命令,比较常用
fg %1 // 打开VIM,1是VIM对应的作业号 fg %2 // 打开GDB bg %1 // 让VIM到后台运行 kill %1 && fg // 彻底杀死VIM进程GDB的“在线刷新”
好了,刚才介绍了无缝切换,那我们可以在不关闭GDB的情况下(注意,ctrl + z不是关闭GDB这个进程,只是挂起)切换到VIM中去修改代码来消除死循环(把第24行的“if (num_y = 0)" 改成"if (num_y == 0)")。动作序列可以是:
ctrl + z // 挂起GDB jobs // 查看VIM对应的作业号,假设为1 fg %1 // 进入VIM,修改代码.. ctrl + z // 修改完后挂起VIM gcc -g -Wall -o insert_sort a.cpp // 重新编译程序 fg %2 // 进入GDB,假设GDB的作业号为2现在,我们又返回GDB调试界面了!但在调试前还有一步,如何让GDB识别新的程序(因为程序已经重新编译)?只要再次运行run就可以了。因为GDB没有关闭,所以之前设置的断点、运行run时传入的命令行参数等还保留着,不需要重新输入。很好用吧!
GDB自动检测到程序发生改变,重新加载符号。
其他bug
关于本例中的其他bug,这里就不多说了。有兴趣的同学,可以和我讨论。
GDB调试程序用法
GDB+GDBserver无源码调试Android 动态链接库的技巧
使用hello-gl2建立ndk-GDB环境(有源码和无源码调试环境)
在Ubuntu上用GDB调试printf源码