2015-10-15 72 views
1

我正在學習一門課程,作爲一個問題集需要建立在教師提供的C服務器框架上。我完成了服務器,因爲它編譯沒有錯誤,但正如我所料,我得到了奇怪的錯誤和不可避免的段錯誤。我通常使用GDB來追逐這類事情,但我不知道如何做到這一點,當我可以得到一個錯誤的唯一方法是讓服務器運行並提交HTTP GET請求。如何調試現場服務器?

有什麼方法來調試這樣的程序?

+1

我通常使用valgrind編譯時使用'gcc -g3'來尋找段錯誤。 – Kotshi

+0

我試着在程序上運行valgrind,並實際上設法崩潰valgrind本身。我甚至不知道這是可能的。 –

回答

0

也許將調試/錯誤信息記錄到服務器中的文件(每條消息帶有時間戳)?您可以隨時檢查文件的內容:

2015-10-15-16:42:00 - Log1 
2015-10-15-16:42:05 - Log2 
2015-10-15-16:42:11 - Error1 
... 
1

我發現,與valgrind啓動程序將導致服務器實際上是「走活」,讓內存泄漏調試。我分割故障是從哪裏來:

char* extensionlowered = "/0"; 
strcpy(extensionlowered, extension); 
extensionlowered[strlen(extensionlowered) + 1] = '\0'; 

extensionlowered只有進入初始\0字節。當我試圖複製更多的東西時,我導致了分段錯誤。固定代碼

char* extensionlowered = malloc(sizeof(extension) + 1); 
strcpy(extensionlowered, extension); 
extensionlowered[strlen(extensionlowered) + 1] = '\0'; 

編輯:

此外,如果GDB來啓動服務器和斷點設置,服務器將「走活」,但不會響應請求,直到斷點允許它。所以我啓動了gdb gdb server,然後break (line),然後run arg 1 arg 2 arg 3。當我通過程序進入主循環並且在適當的時候響應請求時,服務器進入在線狀態。