2010-03-18 143 views
7

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

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

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

gdb -p PID 

在这种情况下使用GDB,这是什么和attach PID之间的区别?

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

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

3)检查目录下./proc

详细信息,在这种情况下,只要到与PID的目录。但是,这是否应该手动完成?

+0

我不认为我见过的'-p'选项。通过PID连接到一个进程是很常见的。究竟是什么问题呢? – Cascabel 2010-03-18 03:16:20

+0

我不确定你的问题真的是什么。您似乎已经有调试C++程序的工作方法,因此您的标题是自我回答的,然后您的帖子主体会询问不相关的内容。你能否改写标题或问题更清楚? – ephemient 2010-03-18 03:33:27

+0

我已经使用'strace -p PID'来跟踪正在运行的C++应用程序的系统调用。我发现调用'open()'失败,错误情况没有得到适当的处理。 – jschmier 2010-03-18 04:02:28

回答

2

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

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

gdb -p <PID>与正在运行的gdb之间没有明显区别,并且在shell中输入attach <PID>

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

1

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

gdb prog PID 

有这样做没有什么区别VS运行gdb prog,然后告诉GDB attach pid

1

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

例如

[email protected]:~/FE/bin> ./fe& 
[1] 5866         
[email protected]:~/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 
[email protected]:~/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上运行。

相关问题