[英]How can I debug a program that starts but appears to do nothing?
我目前有2台虛擬機正在運行,一台是服務器,一台是客戶端。 他們都在運行Ubuntu。 我創建了一個C ++程序來連接到MYSQL服務器。 當我在服務器VM中打開終端時,C ++程序會編譯並正常運行!
但是,當我嘗試在客戶端上運行它時,它將根本無法工作。 該代碼可以完美地編譯,但是當我鍵入“ ./main ”以啟動程序時,什么都沒有出現。 這只是一個空白屏幕。 我完全不知道為什么會這樣。 客戶端和服務器上的代碼完全相同,但是由於某些原因,當我在客戶端上運行它時,它不會顯示任何代碼。 以下是顯示我的意思的圖片
這是查看我所談論內容的屏幕快照的鏈接( http://imgur.com/a/QqgPV )。 在第一張圖片中,我編譯了程序,編譯良好。 然后,我運行該程序,但沒有輸出到屏幕。
第二張圖片顯示了正在服務器上運行的程序,並顯示了在初始./main命令之后屏幕上應該輸出的內容
我應該怎么做才能找出問題所在?
用“ -g -ggdb”編譯並在調試器中運行:
$ cgdb --args ./main your_args
當它阻止按Ctrl-C並鍵入“ bt”時。 這將告訴您程序在哪里停止。 可能有數不勝數的事情阻塞了您的代碼(您使用諸如db之類的外部工具)。
給我們一些代碼進行分析。 沒有細節,我們無濟於事。
順便說一句:它可以編譯的事實並不意味着它將完美運行。
將日志添加到您的程序中,或在strace
下運行它,以strace
在哪里或等待什么。
在最基本的級別上,您可以通過添加日志語句來添加日志記錄。 假設您的代碼如下所示:
a();
b();
c();
output_stuff();
暫時將其更改為:
cout << "about to do a" << endl;
a();
cout << "about to do b" << endl;
b();
cout << "about to do c" << endl;
c();
cout << "done with c" << endl;
output_stuff();
然后查看收到的消息。 如果您沒有“准備做一個”,那么它就是一個掛起的全局對象或進程初始化的構造函數。 如果您獲得“即將執行a”但沒有獲得“即將執行b”,則掛起的a()
。 等等。
在啟用調試符號的情況下生成程序(GCC -g選項)
$ cat infinite.cpp
void infinite()
{
for(;;)
{
}
}
int main()
{
infinite();
}
$ g++ -g infinite.cpp
運行程序:
$ ./a.out
打開新的終端會話
找出您的程序的PID
$ ps x | grep a.out
7817 pts/3 R+ 0:08 ./a.out
運行gdb並將其附加到您的程序(如果出現權限錯誤,則為sudo):
$ gdb
...
(gdb) attach 7817
Attaching to process 7817
...
Loaded symbols for /lib64/ld-linux-x86-64.so.2
infinite () at infinite.cpp:3
3 for(;;)
(gdb) backtrace
#0 infinite () at infinite.cpp:3
#1 0x0000000000400513 in main () at infinite.cpp:10
使用調試器檢查程序在什么位置執行,設置斷點,檢查程序狀態(也許循環計數器之一是無符號整數和溢出等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.