如果需要用GDB调试一个正在运行的进程,可以先通过ps 命令查询到进程的ID,然后用
gdb -pid=ID号来启动对这个程序的调试,
如果进程很多,可以用grep过滤一下
ps ax | grep 进程名
也可以在启动gdb后用
atta 进程号的命令实现对进程的调试
gdb有个很强大的功能,就是其可以通过call命令调用外部函数,
但是在外面的这种情形,这个调用不能得到输出结果
例如调用待调试的进程的函数或者直接调用printf
如: call (void) printf("hello")
都不会有结果,这就涉及到一个输出重定向的问题
要把输出重定向到当前的调试终端才行,
这时只需要做两步,
第一步是关闭当然输出终端
call (int) close(1) 关闭了stdout
call(int) close(2) 关闭了stderr
第二步是获取当前虚拟终端信息
shell tty
第三步就是把当前的输入输出和这个虚拟终端关联起来
p (int) open("当前虚拟终端",1)
p (int) open("当前虚拟终端",2)
如果每次做这样的调试时都需要这样设置一下,会很麻烦,在.gdbinit里面
定义一重定向的函数,每次调用这个函数就可以了
如果还是看不到输出,则是因为有个缓存,调用fflush就可以了
call (int)fflush(0)
参考文献:
http://www.ibm.com/developerworks/cn/linux/l-cn-redirect/index.html