Fatal signal 11 (SIGSEGV), code 2调试方法

来源:互联网 发布:python bt文件下载 编辑:程序博客网 时间:2024/06/06 16:55

JNI中用C语言引起的bug:

Fatal signal 11 (SIGSEGV), code 2

对于习惯Java的程序员, 调试C程序是一件很头痛的事, 尤其是这种bug, 出现一次整个App立刻崩掉, 并且还不给你打印函数调用栈, 压根不知道哪一行出了问题. 如果google或者百度这个错误的描述, 答案往往是指针使用了一个不可用的位置, 或者是数组越界, 对程序问题定位也没有有价值的帮助.

Bug描述

我遇到的这个问题出错误的地方是反复执行了许多次才出现, 这种问题还得多测几次才能复现. 连续执行的越快出现的概率越高.

调试方法: 分而治之

网上有C或者.so文件的调试方法, 大都很麻烦, 而且有的分析log的方式学起来慢. 最终能否解决问题也不一定. 这里给一个一定能解决问题, 而且调试起来很容易的方式.

参考:

程序员你在工作中调试过最难的BUG是什么?

该文所说的方法”分而治之”, 最终帮助他解决了问题. 实际使用该方法的时候需要多次拆分代码.

步骤

  1. 确定问题所发生的代码范围–我这肯定是C代码出了问题
  2. 将问题范围按照流程分2段, 每一段都有一个输入和输出, 注释掉其中一段代码, 然后运行, 如果没问题, 说明正是注释掉的代码的问题. 注释的代码中如果有后面的输入用到的变量就写死.
  3. 按照步骤2, 将问题代码范围逐步缩小, 就算代码量庞大, 第二步执行5次, 就是将问题定位到1/32的代码, 这依然是很快的, 半个小时就搞定了
  4. 最终得到出问题的那几行, 或者那一行, 这样再仔细看代码, 这个时候很容看出问题. 如果是因为对C语言的API不熟悉导致的, 搜一下某个C方法怎么用, 很快就解决了.

上述链接所述的问题最终是硬件的问题, 无论什么问题, 只要定位到出错误的地方就容易很多. 每次把代码拆分成2段, 这样自己会对代码范围的排查清晰一点.

原创粉丝点击