我有一个进程在Linux得到一个分割错误。当它失败时,我如何告诉它生成一个核心转储?
当前回答
为了激活核心转储,请执行以下操作:
In /etc/profile comment the line: # ulimit -S -c 0 > /dev/null 2>&1 In /etc/security/limits.conf comment out the line: * soft core 0 execute the cmd limit coredumpsize unlimited and check it with cmd limit: # limit coredumpsize unlimited # limit cputime unlimited filesize unlimited datasize unlimited stacksize 10240 kbytes coredumpsize unlimited memoryuse unlimited vmemoryuse unlimited descriptors 1024 memorylocked 32 kbytes maxproc 528383 # to check if the corefile gets written you can kill the relating process with cmd kill -s SEGV <PID> (should not be needed, just in case no core file gets written this can be used as a check): # kill -s SEGV <PID>
一旦corefile被写入,请确保在相关文件(1./2./3.)中再次禁用coredump设置!
其他回答
Ubuntu 19.04
其他的答案都帮不了我。但下面的总结起到了作用
创建~ /。配置/apport/settings包含以下内容:
[main]
unpackaged=true
(这告诉apport也为自定义应用程序编写核心转储)
检查:ulimit -c。如果输出0,用
ulimit -c unlimited
只是为了以防万一重启apport:
sudo systemctl restart apport
崩溃文件现在被写入/var/ Crash /。但是不能在gdb中使用它们。要在gdb中使用它们,请使用
apport-unpack <location_of_report> <target_directory>
进一步的信息:
一些回答建议更改core_pattern。请注意,重新启动时该文件可能会被apport服务覆盖。 仅仅停止出口并不能起到作用 ulimit -c值可能会在您尝试web的其他答案时自动更改。确保在设置核心转储创建过程中定期检查它。
引用:
https://stackoverflow.com/a/47481884/6702598
这通常是足够的:
ulimit -c unlimited
注意,这不会在ssh部分之间持续存在!要添加持久性:
echo '* soft core unlimited' >> /etc/security/limits.conf
现在,如果你正在使用Ubuntu,“apport”可能正在运行。下面是检查方法:
sudo systemctl status apport.service
如果是,你可能会在以下位置之一找到核心转储:
/var/lib/apport/coredump
/var/crash
如果您想更改核心转储的位置
确保您拥有创建文件的权限,并且该目录存在于您发送核心转储的目录中!
举个例子。注意,这将不会持续重启:
sysctl -w kernel.core_pattern=/coredumps/core-%e-%s-%u-%g-%p-%t
mkdir /coredumps
确保正在崩溃的进程有权写入该文件。最简单的方法是这样的例子:
chmod 777 /coredumps
测试内核转储是否工作
> crash.c
gcc -Wl,--defsym=main=0 crash.c
./a.out
==output== Segmentation fault (core dumped)
如果上面没有显示“核心转储”,说明有些东西不正常。
这取决于您使用的shell。如果使用bash,则ulimit命令控制与程序执行相关的几个设置,例如是否应该转储core。如果你输入
ulimit -c unlimited
然后这将告诉bash,它的程序可以转储任何大小的内核。如果你愿意,你可以指定一个大小,比如52M,而不是无限,但在实践中,这不应该是必要的,因为核心文件的大小可能永远不会成为你的问题。
在tcsh中,您需要输入
limit coredumpsize unlimited
默认情况下,您将得到一个核心文件。检查进程的当前目录是否可写,否则不会创建核心文件。
值得一提的是,如果你建立了一个系统,那么事情就会有点不同。通常情况下,通过core_pattern sysctl值将核心文件通过systemd-coredump(8)进行管道传输。核心文件大小rlimit通常已经配置为“unlimited”。
然后可以使用coredumpctl(1)检索核心转储。
coredump等的存储由coredump.conf(5)配置。在coredumpctl手册页中有一些如何获取核心文件的示例,但简而言之,它看起来像这样:
找到核心文件:
[vps@phoenix]~$ coredumpctl list test_me | tail -1
Sun 2019-01-20 11:17:33 CET 16163 1224 1224 11 present /home/vps/test_me
获取核心文件:
[vps@phoenix]~$ coredumpctl -o test_me.core dump 16163
推荐文章
- 如何从另一个文件A中删除文件B中出现的行?
- 对以制表符分隔的文件进行排序
- Shell脚本删除超过n天的目录
- 使用sudo时未找到命令
- 如何防止rm报告文件未找到?
- 当有命令行参数时,如何使用GDB分析程序的核心转储文件?
- Bash:获取输出的第n列的最短方法
- 如何使用查找命令从列表中查找所有具有扩展名的文件?
- 如何获得一个变量值,如果变量名存储为字符串?
- RVM不是一个函数,用' RVM use…’不会起作用
- 如何强制从另一个SSH会话分离屏幕?
- 如何打破一个循环在Bash?
- 如何从终端机发送电子邮件?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- Linux Bash中双&和分号有什么区别?