core文件与gdb调试
1、核心轉儲文件(core dump file),下文簡稱core文件。
1)簡介:某些信號(如SIGQUIT、SIGABRT和SIGSEGV)的默認動作就是引起進程終止并產生core文件。該文件包含進程終止時的內存鏡像,用于在調試時探測程序終止時的狀態,以隨時重現錯誤。
coredump的開啟和關閉:用ulimit -a查看若core file size這一項為0,說明coredump沒開啟。ulimit -c可以開啟coredump并指定最大能產生的core文件(0表示關閉coredump)。默認不產生core文件,因為它可能包含敏感信息。
默認的core文件名為core,且在當前目錄產生。/proc/sys/kernel/core_pattern定義了core文件的存放目錄和命名方式(如/data/coredump/core_%e_%t。其中,%e表示可執行文件名、%t表示coredump的時間、%p表示PID、%s表示引發coredump的信號值等)。另外,若/proc/sys/kernel/core_uses_pid的內容是非0值,則core文件名會把進程ID作為擴展(***.pid)。
2)使用core文件進行調試。例子:
int main() { int *p = 0;cout << *p << endl; }步驟:(1)開啟coredump:ulimit -c unlimited;(2)編譯:g++ test.cpp -g;(3)執行:./a.out,出現錯誤Segmentation fault (core dumped)并產生文件core;(4)調試:gdb ./a.out core。
3)通過管道將核心轉儲信息重定向給一個進程,而不是寫入到磁盤文件。
Linux從內核2.6.19開始,若/proc/sys/kernel/core_pattern的首字符是'|'(管道),則該行剩下部分將被解析為一個程序及其命令行參數,并在某個進程發生coredump時被執行。coredump的核心轉儲信息被重定向到該程序的標準輸入。
注意:core_pattern中的程序名必須是絕對路徑,且緊跟在'|'后面;該程序以root用戶/組運行;可指定命令行參數(從Linux 2.6.24開始),如%p表示發生coredump的進程ID,但行的最大長度為128字節。以下是man core中的例子:
// core_pattern_pipe_test.c// 忽略錯誤處理邏輯 #define BUF_SIZE 1024int main(int argc, char *argv[]) {// 將目錄切換到發生coredump的進程的工作目錄。argv[1]即core_pattern文件的%pchar cwd[PATH_MAX];snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);chdir(cwd);FILE *fp = fopen("core.info", "w+");// 在core.info中寫入發生coredump的進程的信息int j = 0;fprintf(fp, "argc=%d\n", argc);for (j = 0; j < argc; j++){fprintf(fp, "argc[%d]=<%s>\n", j, argv[j]);}// 核心轉儲信息的字節數int tot = 0;ssize_t nread;char buf[BUF_SIZE];while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0){tot += nread;}fprintf(fp, "Total bytes in core dump: %d\n", tot);exit(EXIT_SUCCESS); }
編譯得到core_pattern_pipe_test(在/home/hanerfan/programming目錄) -> 將/proc/sys/kernel/core_pattern的內容改為"|/home/hanerfan/programming/core_pattern_pipe_test %p UID=%u GID=%g sig=%s"
執行sleep 100,然后按Ctrl+\,則sleep進程被SIGQUIT信號終止并產生核心轉儲信息 -> 因為core_pattern首字符為'|',因此執行/home/hanerfan/programming/core_pattern_pipe_test %p...。core.info中寫入了一些核心轉儲信息,如下:
~/programming$ sudo cat core.info argc=5 argc[0]=</home/hanerfan/programming/core_pattern_pipe_test> argc[1]=<5314> argc[2]=<UID=1000> argc[3]=<GID=1000> argc[4]=<sig=3> Total bytes in core dump: 356352?
2、gdb調試
1)gdbserver:Remote Server for the GNU Debugger。遠程調試。
(1)安裝
yum install gdb-gdbserver.x86_64 # 可先用yum search gdbserver搜索到對應的安裝包(2)運行
I、服務器:執行gdbserver localhost:2345 ./a.out(在2345端口上監聽遠程gdb請求,a.out為被調試的程序)。
II、客戶端:
[root@localhost siosvr]# gdb (gdb) file a.out (gdb) target remote 192.168.32.101:2345 # 客戶端和服務器建立了連接(101為服務器地址)。 (gdb) b 10 # 設置斷點 (gdb) continue # 服務器端的a.out開始運行,并在該斷點處“暫停” (gdb) continue # 服務器端的a.out正常退出,GDBserver退出?
?
?
不斷學習中。。。
轉載于:https://www.cnblogs.com/hanerfan/p/3380938.html
總結
以上是生活随笔為你收集整理的core文件与gdb调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Windows8.1更新后Sql S
- 下一篇: [BizTalk]在高可用性环境下配置B