簡體   English   中英

如何調試啟動但似乎無能為力的程序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM