2011-10-25 22 views
0

我目前有2個虛擬機正在運行,一個是服務器,另一個是客戶端。他們都在運行Ubuntu。我創建了一個C++程序來連接到MYSQL服務器。當我在服務器虛擬機中打開一個終端時,C++程序編譯並運行非常完美!如何調試一個啓動但看起來什麼都不做的程序?

但是,當我嘗試在客戶端上運行它時,它根本無法工作。代碼編譯完美,但是當我輸入「./main」啓動程序時,NOTHING出現。這只是一個空白的屏幕。我完全不明白爲什麼會發生這種情況。代碼在客戶端和服務器上都完全一樣,但由於某種原因,當我在客戶端上運行代碼時,它不會顯示我的任何代碼。下面是圖片來展示我的意思

這裏是一個鏈接,查看我正在談論的屏幕截圖(http://imgur.com/a/QqgPV)。在第一張圖片中,我編譯了編譯好的程序。然後我運行該程序,但沒有輸出到屏幕上。

第二圖爲程序被運行在服務器上,說明了什麼是假設在屏幕上輸出的初始./main命令後

我應該怎麼做,找出什麼錯誤?

+0

正如David Schwartz所建議的那樣,添加打印日誌記錄語句以查看程序得到的程度。但是,我的ESP工作正常:最有可能的是,您的mysql服務器配置爲允許來自某些IP地址的連接,而不允許其他人連接。 –

+1

當您收到編譯器警告時,這並不算作「編譯完美」。 –

+1

您不包含任何代碼,所以我們任何人都很難猜測出現了什麼問題。但通常我認爲你應該學會使用調試器。 – asveikau

回答

1

要麼將​​日誌記錄添加到您的程序中,要麼運行它在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(); 

然後看看你會得到什麼消息。如果你沒有「要做一個」,那麼它就是全局對象或進程初始化的構造函數。如果你「要做一個」而不是「要做b」,那麼這是掛起的a()。等等。

+0

如果兩個平臺上的代碼是相同的,它可能會等待什麼呢?對不起,即時通訊新的Linux,所以我不熟悉「strace」 – user1013596

+0

沒有知道代碼的作用沒有辦法知道。也許,例如,它試圖解析一個名稱,一臺機器有DNS,另一臺沒有。也許這完全是另一回事。直到你看,你纔會知道。 (該程序在輸出任何內容之前做了什麼?這就是卡住了。) –

+0

知道了,謝謝。當試圖連接到他的服務器時,我發現它掛起。 – user1013596

2

編譯 「-g -ggdb」,並在調試器中運行:

$ cgdb --args ./main your_args

當塊PRES按Ctrl-C,然後輸入 「BT」。這會告訴你程序停止的地方。 有可能是一個巨大的事情阻止你的代碼(你使用外部的東西,如db)。

給我們一些代碼分析。沒有具體細節我們就無能爲力。

順便說一句:它編譯的事實並不意味着它將完美運行。

+0

如果只有它... – Ayjay

0

生成程序啓用調試符號(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 

使用調試器在執行什麼時候檢查是你的程序,設置斷點,檢查程序的狀態(也許循環計數器之一是無符號整數和溢出等)

相關問題