如何在Linux中调试正在运行的C ++程序?

时间:2010-03-18 03:05:56

标签: c++ debugging gdb

我有一个关于在Linux中调试正在运行的C ++程序的问题。如果编程已经在运行并且无法中断,那么该怎么做。

我可以找到三种方式,但我对细节知之甚少,如果有人能够更深入地阐述它,我将不胜感激。

1)我们可以通过指定进程ID

来使用GDB
gdb -p PID

在这种情况下,这与attach PID之间有什么区别?

2)我们可以使用pstat,但是,我使用的是Ubuntu,没有pstat,只有mpstat

似乎mpstat没有提供太多信息,也没有提供太多选项。

3)检查目录./proc

下的详细信息

在这种情况下,只需转到带有PID的目录。但是,这应该是手动完成吗?

3 个答案:

答案 0 :(得分:2)

我在gdb man或他们的文档中找不到-p选项,但它确实有效!我已经在RedHat上使用旧版本和Debian上的7.0.1多次尝试过。

我不确定它是如何通过PID(也许是/proc/<PID>/exe)找到exe的,但确实如此。由于它没有在他们的文档中描述,也许它不是最推荐的方式,但我没有遇到任何问题。

gdb -p <PID>和正在运行的gdb以及在他们的shell中键入attach <PID>之间没有明显区别。

我个人更喜欢ps xa| grep myprogram来获取PID

答案 1 :(得分:1)

关于技术1,没有-p标志,你仍然需要程序的名称:

gdb prog PID

执行该操作与运行gdb prog然后告诉gdb attach pid没有区别。

答案 2 :(得分:1)

使用ps -ef | grep <your program>获取PID。然后运行gdb <your program> <PID>pstat不是标准命令。我只在Solaris上使用它。

e.g。

gayan@gayan:~/FE/bin> ./fe&
[1] 5866                                 
gayan@gayan:~/FE/bin> ps -ef | grep fe
gayan     5866  5836  2 10:19 pts/3    00:00:00 ./fe
gayan     5871  5836  0 10:19 pts/3    00:00:00 grep fe
gayan@gayan:~/FE/bin> gdb fe 5866
GNU gdb (GDB; openSUSE 11.1) 6.8.50.20081120-cvs       
Copyright (C) 2008 Free Software Foundation, Inc.      
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.           
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"   
and "show warranty" for details.                                             
This GDB was configured as "i586-suse-linux".                                
For bug reporting instructions, please see:                                  
<http://bugs.opensuse.org/>...                                               
Attaching to program: /home/gayan/FE/bin/fe, process 5866

以上是在openSuse上运行但应该在Ubuntu上运行。