作家
登录

用gdb分析coredump的一些技巧

作者: 来源: 2017-05-11 09:05:20 阅读 我要评论

在 C 层面制造出崩溃的可能性并不是很多,数据越界是一类常见的 bug (此次并不像);另一类是内存治理掉足,比如对同一个指针 free 多次,导致内存治理器掉足,把同一个地址分派给两个地位,导致两个对象地址重叠。后一类问题能干扰到 C 的 stack frame 可能性比较小,除非有堆上的对象指针指向了栈地址,然后并引用。此次的 bug 中,最打的线索是 L->errorJmp ,也就是 lua 线程中指向恢复点的 jmp_buf ,它是在 C 栈上的。

L 中有一些相干变量可以推想 resume/yield/pcall 等的履行状况: L->nny L->nCcalls L->ci->callstatus 等都是。我分析的结不雅是在 auxresume 返回后,没有持续运行 luaB_coresume 中的 push boolean 过程,却竽暌怪运行了新的一轮 luaD_pcall ,导致了最终的崩溃。这可以经由过程 L 的 errorJmp 的 status 获得必定的佐证。不过 C stack 膳绫腔有 luaB_coresume 的返回地址比较难解释,只能说是可能被缺点的运行流程覆盖掉落了。

gc 会是触发 bug 的多发点,因为 gc 是平行于主流程同步进行的。此次崩溃点的子线程的 lua 栈帧逗留在 yield 函数上,在此之前也切实其实调用了 gc step 。然则,我们可以经由过程查阅 L 的 gcstate 变量查看 gc 处于什么阶段。在此次的事发明场,可以看到 gcstate 为 GCSpropagate 也就是 mark 阶段,所以并不会激发任何 __gc 流程,也没有内存释放。

结论:对于 bug ,临时没有结论。不过对于调试 lua 编写的法度榜样,照样积聚了一些经验:

  1. 必定要在编译 lua 时加 -g ,固然 lua 本身出严重 bug 的可能性极低,但可以便利在出问题时用 gdb 分析。
  2. 在 gdb 中查看 lua 的调用栈很有意义,分析 L->ci 很轻易拿到调用栈信息。
  3. 记得查看一下 lua 的数据栈内容,包含已经 pop 出去,但还残留在内存中的数据,可以赞助分析崩溃时的状况。
  4. 记得查看 L 中保存的 gcstate GCdebt 等 gc 相干变量,可以用于揣摸 lua gc 的工作状况。
  5. L 中的 nny nCcalls errorJmp 可以赞助肯定 lua 到 C 的调用层次。留意:一个 yield 状况的 coroutine ,errorJmp 指针应当为 NULL 。

别的,gdb 分析 skynet 可以大年夜下面的线索入手:

  1. context 对象里能找到当前办事的地址、最后一个向外提起的请求的 session 、接收过若干条消息等。结合 log 文件来看会有参考价值。
  2. 如不雅想找到内存中其它的办事对象(非当前哨程上晃荡的),可以尝尝 p *H 。 H 是个数组,定义在 skynet_handle.c 中,琅绫擎有所有办事的地址。
  3. 如不雅想找到内存中待唤醒的 timer ,可以尝尝 p *TI 。它定义在 skynet_timer.c 中。

【编辑推荐】

  1. 前端开辟JS:事宜轮回机制、调用栈以及义务队列
  2. 前端开辟js运算符单竖杠“|”的用法和感化及js数据处理
  3. Node.js对于Java开辟者而言是什么?
  4. 应用嵌入式开辟板实现对车位锁控制的流程及法度榜样实现
  5. 2017年前端开辟对象趋势
【义务编辑:51CTO_OS TEL:(010)68476606】

  推荐阅读

  私有云2.0时代来临,OpenStack已上车

OpenStack已经进入第七年了,如今治理着跨越500万个处理器核心。它的增长在很大年夜程度上与私有云安排有关。而如今,OpenStack基金会称,企业须要为私有云2.0做好预备,因为下一代技巧的>>>详细阅读


本文标题:用gdb分析coredump的一些技巧

地址:http://www.17bianji.com/lsqh/35135.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)