我使用Debian x64 2.6.26來託管我們用C++編寫的服務器應用程序。有時GDB會自行激活,它使用100%的CPU時間,無法讓其他進程運行。 GDB版本是6.8-debian。我不知道爲什麼會發生這種情況,我可以如何防止這種情況。它似乎只在服務器應用程序運行時纔會發生。我需要知道如何阻止這種情況發生,或者如果我們的應用程序出現問題,那麼我怎麼才能找到它。任何幫助深表感謝。GDB自動激活並具有100%的CPU活動
感謝
我使用Debian x64 2.6.26來託管我們用C++編寫的服務器應用程序。有時GDB會自行激活,它使用100%的CPU時間,無法讓其他進程運行。 GDB版本是6.8-debian。我不知道爲什麼會發生這種情況,我可以如何防止這種情況。它似乎只在服務器應用程序運行時纔會發生。我需要知道如何阻止這種情況發生,或者如果我們的應用程序出現問題,那麼我怎麼才能找到它。任何幫助深表感謝。GDB自動激活並具有100%的CPU活動
感謝
我傾向於相信,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;
}
也許這屬於superuser.com?看起來比編程相關的系統更多。然後再次,gdb是如此編程相關,我不知道。 – 2009-12-11 08:33:32
我們的編譯選項看起來有些問題,或者我們的代碼有問題,但是我不知道哪一個是錯的。所以它與superuser.com – 2009-12-11 08:48:04
沒有關係,自動啓動的GDB不是我聽說過的。這是應用程序的目的嗎? – 2009-12-11 16:43:20