先說點基本的。
預設在linux中,出現segment fault時,是不會出現core dump的檔案的。需要去更改一下core file size
怎麼看core file size了
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited
更改的時候用ulimit -c 1024,不過我一般直接ulimit -c unlimited
這個時候在執行一下程式,會發現目前目錄下出現了core檔案
gdb 可執行檔案名 core
gdb:> bt
即可以檢視函數出錯時候堆棧結構
說到JNI,在JNI調用c/c++的庫時,通過以上的設定,也會出現core檔案,不過由于我們運作的時候是用 java 執行的可執行程式,是以,該怎麼用gdb看core dump了。
其實很簡單,既然是java産生的core,那就用java看好了。
于是
gdb java core
gdb:> bt
然後會看到很多 ?()的行,直接忽略,看c/c++的庫,會看到什麼地方産生了signal,基本就能定位了。