博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux下线程调试 ulimit core
阅读量:2391 次
发布时间:2019-05-10

本文共 2918 字,大约阅读时间需要 9 分钟。

在linux 下写线程程序的同学估计都遇到过找bug找到崩溃的情况,多线程情况下bug的追踪实在是不容易。

现在我来介绍一个好用的方法 ulimit core。

先简单介绍一下ulimit是个什么(你也可以man ulimit自己查看)。

“‘当系统中的一些程序在遇到一些错误以及crash时,系统会自动产生core文件记录crash时刻系统信息,包括内存和寄存器信息,用以程序员日 后debug时可以使用。这些错误包括段错误、非法指令、总线错误或用户自己生成的退出信息等等,一般地,core文件在当前文件夹中存放。

但是为什么我们平时没有看到core文件呢? 那是因为你的系统设置了core文件的大小为0。如果你需要用core文件进行调试,用 ulimit -c unlimited即可设置core文件大小无限制。

其他参数如下:

参  数:   -a  显示目前资源限制的设定。    -c 
 设定core文件的最大值,单位为区块。 -d
<数据节区大小>
 程序数据节区的最大值,单位为KB。 -f
<文件大小>
 shell所能建立的最大文件,单位为区块。 -H  设定资源的硬性限制,也就是管理员所设下的限制。 -m
<内存大小>
 指定可使用内存的上限,单位为KB。 -n
<文件数目>
 指定同一时间最多可开启的文件数。 -p
<缓冲区大小>
 指定管道缓冲区的大小,单位512字节。 -s
<堆叠大小>
 指定堆叠的上限,单位为KB。 -S  设定资源的弹性限制。 -t
 指定CPU使用时间的上限,单位为秒。 -u
<程序数目>
 用户最多可开启的程序数目。 -v
<虚拟内存大小>
 指定可使用的虚拟内存上限,单位为KB。

你可以用ulimit -a 查看所有信息:

core file size          (blocks, -c) unlimiteddata seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 139264max locked memory       (kbytes, -l) 32max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimitedmax user processes              (-u) 139264virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited[chenlei@yq-cl-svr2 Online_Install]$ ulimit -c 0[chenlei@yq-cl-svr2 Online_Install]$ ulimit -acore file size          (blocks, -c) 0data seg size           (kbytes, -d) unlimitedscheduling priority             (-e) 0file size               (blocks, -f) unlimitedpending signals                 (-i) 139264max locked memory       (kbytes, -l) 32max memory size         (kbytes, -m) unlimitedopen files                      (-n) 1024pipe size            (512 bytes, -p) 8POSIX message queues     (bytes, -q) 819200real-time priority              (-r) 0stack size              (kbytes, -s) 10240cpu time               (seconds, -t) unlimitedmax user processes              (-u) 139264virtual memory          (kbytes, -v) unlimitedfile locks                      (-x) unlimited

core文件有时可能在你发生错误时,并没有出现在你当前的文件夹中,发生这种情况的原因有两个:一个是当前终端被设置为不能弹出core文件;另一种则是core文件被指定了路径。除了可以设置core文件的大小之外,还可以对core文件的名称进行一些规定。这种设置是对/proc/sys/kernel/core_pattern和/proc/sys/kernel/core_uses_pid这两个文件进行修改。改动这两个文件的方法如下:

echo <pattern> > /proc/sys/kernel/core_pattern

echo <"0"/"1"> /proc/sys/kernel/core_uses_pid

并且注意,只有超级用户才可以修改这两个表。’”

当你得到core文件之后,就可以利用gdb进行调试了!

gdb  exe(你的可运行程序)  ./core.pid(core文件)
进去后,使用bt即可查看死掉时栈的情况,省掉了无尽的调试跟踪,是不是很方便~。

然后使用frame命令。

还有就是里面某个线程停住,也没死,这种情况一般就是死锁或者涉及消息接受的超时问题(听人说的,没有遇到过)。遇到这种情况,可以使用:
gcore pid (调试进程的pid号)
手动生成core文件,在使用pstack(linux下好像不好使)查看堆栈的情况。如果都看不出来,就仔细查看代码,看看是不是在 if,return,break,continue这种语句操作是忘记解锁,还有嵌套锁的问题,都需要分析清楚了。

有了这个方法,多线程调试再也不头疼了!

参考

转载地址:http://unmab.baihongyu.com/

你可能感兴趣的文章
网易工程师 Ruheng 一文教你轻松学会 Git
查看>>
文字与编码的奥秘(下)
查看>>
阿里分布式事务框架 GTS 全解析
查看>>
轻量级 Web 框架 Gin 结构分析
查看>>
一个字节的网络漫游故事独白
查看>>
RabbitMQ 消息可靠性、延时队列以及高可用集群
查看>>
分布式系统的可靠性指的是什么 —— 你可能从来就没有认真思考过
查看>>
布隆过滤器过时了,未来属于布谷鸟过滤器?
查看>>
面试题 —— 数字幻方
查看>>
5折抢购最后一天 | 戴尔顶级配置电脑,限时秒!
查看>>
SpringBoot 究竟是如何跑起来的?
查看>>
阿里开源限流组件 Sentinel 集群流控全解析
查看>>
深度解密HTTP通信细节
查看>>
日活亿级用户的服务器架构要怎么搭?
查看>>
深入 LevelDB 数据文件 SSTable 的结构
查看>>
分布式系统技术难题--异地多活
查看>>
MySQL 是怎样运行的:从根儿上理解 MySQL
查看>>
一种简单易懂的 MyBatis 分库分表方案
查看>>
阿里巴巴 Nacos 分布式配置中心原理
查看>>
图解Go语言内存分配
查看>>