1.在Linux下,当程序崩溃时,会生成一个core文件,其中包含了程序崩溃时的内存状态信息。可以使用gdb调试器来分析core文件,定位到崩溃的代码位置。
具体步骤如下:
确认程序已经开启core dump功能。可以使用ulimit命令查看:
ulimit -a
如果core file size为0,则需要设置core dump大小:
ulimit -c unlimited
运行程序,让它崩溃,生成core文件。
使用gdb调试器打开core文件:
gdb <程序名> <core文件名>
使用bt命令查看调用栈信息,找到崩溃的位置:
bt
如果需要查看具体代码,可以使用list命令:
list <行号>
如果需要查看变量的值,可以使用print命令:
print <变量名>
通过以上步骤,可以定位到崩溃的代码位置,并进行调试。
2.如果未找到core文件,如client/cli/core: No such file or directory.
如果程序崩溃后没有生成core文件,可能是因为core dump功能没有开启。可以使用ulimit命令查看当前core dump大小限制:
ulimit -a
如果core file size为0,则需要设置core dump大小:
ulimit -c unlimited
另外,还需要确认程序是否被设置为不生成core文件。可以使用以下命令查看:
cat /proc/sys/kernel/core_pattern
如果输出为空或者为“|/usr/share/apport/apport %p %s %c %d %P %E”,则表示程序被设置为不生成core文件。可以使用以下命令修改:
echo "core.%e.%p" > /proc/sys/kernel/core_pattern
修改后,再次运行程序,让它崩溃,就可以生成core文件了。
3.如果遇到没有权限:echo “core.%e.%p” > /proc/sys/kernel/core_pattern-bash: /proc/sys/kernel/core_pattern: Permission denied
可以使用以下命令切换到root用户:
sudo su -
然后再执行修改core_pattern的命令:
echo "core.%e.%p" > /proc/sys/kernel/core_pattern
修改完成后,可以使用exit命令退出root用户。
如果不想生成core文件,可以使用以下命令关闭core dump功能:
ulimit -c 0
这样,程序崩溃时就不会生成core文件了。如果需要重新开启core dump功能,可以将core dump大小设置为非0值,例如:
ulimit -c unlimited
另外,也可以将core_pattern设置为空,这样程序崩溃时也不会生成core文件:
echo "" > /proc/sys/kernel/core_pattern