平常初次定位问题时,我一般是先看看 api 调用,再不济就多看看堆栈,如用 gdb 的commands 指令在 每次断点时自动打印堆栈。
strace 有个实验性的功能,在打印每个系统调用的同时打印当时的堆栈,有了堆栈简直就是手握问题的钥匙。
strace -h
...
-k obtain stack trace between each syscall
...
but,but,but,but,but,but,but,but,but,but,but,but,
公司中开发环境的centos linux 上自带的 strace 没有编译对 -k 功能 的支持。只能自己从源代码中编译。
[strace-4.24]# ./configure --help
...
--with-libdw use libdw to implement stack tracing support
--with-libunwind use libunwind to implement stack tracing support
--with-libiberty use libiberty to demangle symbols in stack trace
...
首次编译时,只加了 --with-libunwind ,--with-libunwind 与 --with-libdw 功能是同样的,选其中一个就可以了,只是我对 libunwind 多点偏好而已。