在linux下开发的工程师们对CoreDump肯定都不陌生,但凡有些许经验的工程师都或多或少使用过CoreDump文件定位过崩溃问题。之前工作中,在Android系统下开发C++程序时, 经常用到CoreDump。 中间转行去搞iOS已经五年了, 最近换了新工作,遇到程序宕掉同事让我看一下coredump文件,一时还没有反应过来, 今天好好复习一下。
coredump文件是在程序出错而异常中断时,系统保存的状态文件。工程师可以通过gdb相应的程序,跟上coredump文件,还原程序崩溃时的状态,正常都可以从中查看到崩溃时的调用栈。
如何使系统创建coredump文件
默认系统时不会开启coredump功能的, 需要我们使用命令打开
1 | // 使用ulimit -c 查看是否打开coredump, 如果返回为0则没有打开 |
使用命令打开的话, 只有当前终端生效。 如果要使系统生效的话, 需要修改/etc/security/limits.conf文件
相关配置
默认coredump文件在程序所在目录下生成,并且文件名为core。 可以通过修改/proc/sys/kernel/core_pattern来控制生成的路径及文件名。
1 | /temp/core-%e-%p-%t // 在temp目录下, 文件名为 core-程序名-pid-时间 |
还可以通过在程序中,调用系统函数设置coredump的文件大小
1 | int setrlimit(int resource, const struct rlimit *rlimt); |
调试命令
1 | // 生成core文件后, 使用gdb查看信息 |
macos 的core文件默认生成到/cores/目录下
示例
由于mac上面没有安装gdb, 就用lldb来演示了
问题代码
1 |
|
1 | Keep:temp keep$ lldb ./m -c /cores/core.1172 |
我们从中可以看到栈顶函数是errorFunction, 结合代码分析一下,很容易发现问题。
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。