2009-12-11 77 views
1

我使用Debian x64 2.6.26來託管我們用C++編寫的服務器應用程序。有時GDB會自行激活,它使用100%的CPU時間,無法讓其他進程運行。 GDB版本是6.8-debian。我不知道爲什麼會發生這種情況,我可以如何防止這種情況。它似乎只在服務器應用程序運行時纔會發生。我需要知道如何阻止這種情況發生,或者如果我們的應用程序出現問題,那麼我怎麼才能找到它。任何幫助深表感謝。GDB自動激活並具有100%的CPU活動

感謝

+1

也許這屬於superuser.com?看起來比編程相關的系統更多。然後再次,gdb是如此編程相關,我不知道。 – 2009-12-11 08:33:32

+1

我們的編譯選項看起來有些問題,或者我們的代碼有問題,但是我不知道哪一個是錯的。所以它與superuser.com – 2009-12-11 08:48:04

+0

沒有關係,自動啓動的GDB不是我聽說過的。這是應用程序的目的嗎? – 2009-12-11 16:43:20

回答

3

我傾向於相信,GDB是越來越在一些代碼的信號處理函數調用。另一個嫌疑犯是一些系統監控守護進程,如'monit'。當有流氓進程吃掉太多的內存或CPU時,它可能會嘗試使用GDB進行回溯或轉儲。在解決問題的方法是在GDB進程中使用'lsof',並查看GDB打開了哪些文件,看看它是否給你提供任何線索。使用'ps -ef -o cmd,pid,ppid | grep -i gdb',你可以找出GDB是如何啓動的,如果它給你附加進程的PID,你就會知道哪個進程正在被檢查。

對於存根這種自動執行的大錘方法是用存根'GDB'代替'GDB',它不做任何事情。 GDB的不存在可能表示錯誤。當我沒有時間深入研究這個問題時,我做了這種骯髒的詭計。在存根GDB中,可以記錄所有命令行參數和調用進程名稱。

在 'C' 的樣品存根:

#include <stdio.h> 

int 
main(int argc, char *argv[]) { 
    size_t sz; 
    FILE *fp = 0; 
    fp = fopen("/tmp/gdbstub.log", "a"); 
    if (fp) { 
     fprintf(fp, "\n%s invoked:", argv[0]); 
     for (sz = 0; sz < argc - 1; sz++) { 
      fprintf(fp, "%s ", argv[sz]); 
     } 
     fclose(fp); 
    } 
    return 0; 
}