先说点基本的。
默认在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,基本就能定位了。