ulimit -c 1073741824
#設置內核轉儲文件上限#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *a=NULL;
*a=0x1;
return 0;
}
gcc 14_a.c -g
#注意加上-g選項保存調試信息./a.out
#運行,,正常應該報錯file *core
:在當前目錄下查看生成的內核轉儲文件gdb -c core ./a.out
:用GDB調試生成的內核轉儲文件,出現以下信息[New LWP 3096]
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00000000004004e6 in main () at 14_a.c:7 7 *a=0x1; (gdb) q
上述信息指示第7行在訪問a地址的時候出現錯誤編程
ulimit -S -c unlimited > /dev/null 2>&1
DAEMON_COREFILEFILE='unlimited'
fs.suid_dumpable=1
gcc -wall -02 -werror -g 源文件
./a.out ;ls *core
#運行並查看內核轉儲文件gdb -c core ./a.out
:用GDB調試生成的內核轉儲文件,出現以下信息b main
:在main函數出設置斷點info braek
:查看斷點run -a
:運行程序start
:同上backtrace full -N
:在端點處顯示最後的N個棧幀print
:顯示局部變量info reg
:顯示寄存器值p/c $eax
:ASCII顯示寄存器的值 x/10i $pc
:顯示地址pc處的10條彙編代碼 disassemble
:反彙編當前的整個函數disassemble 程序計數器
:反彙編程序計數器所在函數的整個函數disassemble 開始地址 結束地址
:反彙編從開始地址到結束地址之間的部分next
:執行下一步step
:執行到函數內部nexti
:逐條執行彙編指令continue
:繼續執行,加數字如 c 5表遇到5次斷點不中止watch <表達式>
:常量或變量發生變化時暫停運行awatch <表達式>
:被訪問、改變時暫停訪問rwatch <表達式>
:被訪問時暫停運行 awatch short_output
:short_output被訪問時暫停運行delete b
:刪除斷點和監視點set variable <變量>=<表達式>
:如set variable a=1,把a的值改成1generate-core-file
:生成內核轉儲文件gcore 'pidof emacs'
:在命令行直接生成內核轉儲文件