我正在學習一門課程,作爲一個問題集需要建立在教師提供的C服務器框架上。我完成了服務器,因爲它編譯沒有錯誤,但正如我所料,我得到了奇怪的錯誤和不可避免的段錯誤。我通常使用GDB來追逐這類事情,但我不知道如何做到這一點,當我可以得到一個錯誤的唯一方法是讓服務器運行並提交HTTP GET請求。如何調試現場服務器?
有什麼方法來調試這樣的程序?
我正在學習一門課程,作爲一個問題集需要建立在教師提供的C服務器框架上。我完成了服務器,因爲它編譯沒有錯誤,但正如我所料,我得到了奇怪的錯誤和不可避免的段錯誤。我通常使用GDB來追逐這類事情,但我不知道如何做到這一點,當我可以得到一個錯誤的唯一方法是讓服務器運行並提交HTTP GET請求。如何調試現場服務器?
有什麼方法來調試這樣的程序?
也許將調試/錯誤信息記錄到服務器中的文件(每條消息帶有時間戳)?您可以隨時檢查文件的內容:
2015-10-15-16:42:00 - Log1
2015-10-15-16:42:05 - Log2
2015-10-15-16:42:11 - Error1
...
我發現,與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
。當我通過程序進入主循環並且在適當的時候響應請求時,服務器進入在線狀態。
我通常使用valgrind編譯時使用'gcc -g3'來尋找段錯誤。 – Kotshi
我試着在程序上運行valgrind,並實際上設法崩潰valgrind本身。我甚至不知道這是可能的。 –