天天看點

用GDB調試JNI程式

先說點基本的。

預設在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,基本就能定位了。