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

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

我可以找到三种方法,但我对细节不太了解,如果有人能够更深入地阐述它,我很感激。

1)我们可以通过指定进程ID来使用GDB

gdb -p PID

在这种情况下,这个和attach PID什么区别?

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

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

3)检查目录./proc下的详细信息

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


我无法在gdb或其文档中找到-p选项,但它确实有效! 我在RedHat和Debian的7.0.1上使用旧版本尝试了很多次。

我不知道它究竟是如何找到exe(可能是/proc/<PID>/exe ),但它确实。 由于没有在他们的文档中描述,也许这不是最推荐的方式,但我没有任何问题。

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

我个人比较喜欢ps xa| grep myprogram ps xa| grep myprogram获取PID


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

gdb prog PID

这样做与运行gdb prog并且然后告诉gdb attach pid没有区别。


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

例如

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上运行。

链接地址: http://www.djcxy.com/p/45197.html

上一篇: How to debug a running C++ program in Linux?

下一篇: Drupal Query builder