【问题标题】:GDB,continue in recursive function, can't stop after exact number of stepsGDB,继续递归函数,在确切的步数后不能停止
【发布时间】:2014-05-17 05:44:01
【问题描述】:

有一件尴尬的事情,可能不好问,但我想听听有没有人以前有过类似的经历。 我正在调试一个巨大的 c 源代码,我发现错误发生在哪里。它在递归函数中。

bool interpret(...)
 {
  switch(..)
  ....
  ....
   case INSTR_GETLINK:
   {
   LmnInstrVar linki, atomi, posi;
   READ_VAL(LmnInstrVar, instr, linki);
   READ_VAL(LmnInstrVar, instr, atomi);
   READ_VAL(LmnInstrVar, instr, posi);

  warry_set(rc, linki,
            LMN_SATOM_GET_LINK(wt(rc, atomi), posi),
            LMN_SATOM_GET_ATTR(wt(rc, atomi), posi),
            TT_ATOM);

  break;
 } 
 ....

}

分段错误发生在“warry_set”。坏事是在那条线上第一次没有发生错误,它 数次后出现。而这个“解释”功能在许多其他地方都调用了自己。

我想知道“warry_set”发生了多少步错误。 我通过行号在它处设置断点。 我试着找出来,“继续100”,我改变了很多次 问题是,有时“继续 100”会报告错误,这让我觉得,“warry_set”在 100 时间内发生错误。有时会出现错误,介于 100-200 之间。我的意思是使用 continue ,我无法确定有多少步骤会导致错误。我认为通过这种方式找出错误的确切时间并没有错。但我根本没有在某个确切的时间发生..

我怎样才能找出错误的确切时间?有经验的大侠,请给点建议,如果我做错了,请纠正我。 另外,如何找到“warry_set”的定义? “step”没有进入那个函数,“info function warry_set”什么也没找到。 :( "whatis warry_set" 说,没有这样的符号,也许我没有加载每个符号。

提前谢谢你

【问题讨论】:

标签: c gdb


【解决方案1】:

虽然您可能能够找到一种设置良好条件断点的方法,但添加到warry_set() 将消息写入文件(或控制台)可能会容易得多,可能包括其有趣的参数值。

【讨论】:

  • 谢谢,这听起来不错。
  • 还有一个问题,GDB,如何找到函数的定义?我的意思是,我想知道“warry_set”在哪里定义,但找不到。我是linux新手,所以..
  • @alim:最简单的方法是在函数上设置断点,看看它是否报告了源代码文件名和行号。 break warry_set.
  • break warry_set 表示未定义函数warry_set。没有定义,没有准确的错误时间,这对我来说是个大问题
  • @alim:尝试输入break warry_set,然后按 键(可能几次),看看它是否提供了所需的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多