2010-03-18 145 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上運行。

相關問題