[hellogcc] Re: [投稿] Debugger Not In Depth: inferior call

  • From: asmwarrior <asmwarrior@xxxxxxxxx>
  • To: hellogcc@xxxxxxxxxxxxx
  • Date: Sun, 03 Jul 2011 22:10:06 +0800

On 2011-7-3 16:46, Yao Qi wrote:
2011/6/28 Hui Zhu<teawater@xxxxxxxxx>:
抱歉回晚了 这个文章挺好 不过我建议是否可以在开头简单介绍一下inferior call的作用 举几个小例子什么的 是否会更清晰一些
让读者明白这是一个什么功能?

修改了第一部分和第三部分。

1 什么是inferiro call

在解释inferior call的实现原理之前,我们先解释一下inferior call是什么。 inferior
call 可以被简单地理解为“调试器在当前的堆栈上,主动调用被调试程序的函数,并且正
确的得到函数的返回值(这一句好像有点多余)”。inferior call理解起来,远比我们想
象的简单,这个功能在我们的调试过程经常会被用到。比如有这样一段代码片段,

extern int bar (int);

void
foo ()
{
   /* i is avaliable before.  */
   o = bar (i);
}

假设现在程序执行到foo中,即将调用bar,我们想检查给定一个输入,函数的bar的返回值
是否正确。通常这个时候我们想在GDB这里调用一下目标代码中的函数,

(gdb) p bar (5)
$1 = 4

其实bar (5)是在目标端运行的,这就是一个inferior call。

在有些程序中,为了方便调试,开发人员会开发一些调试函数,留在程序中。这样在调试
阶段,就可以利用inferior call这个功能,把一些程序的内部状态给打印出来。比如在调
试GCC rtl的时候,我们经常在GDB中用 p print_rtx (rtx),来打印rtx 的内容。这就是
一个inferior call。

2 inferiro call的原理 [没变]

3 inferiro call在GDB中的实现
[表格没变]
inferior call在GDB中的实现,相对模块化,没有与其他的部分有过多的联系,但是我们
可以看到在GDB的实现中,引入了一个dummy frame 这个概念。这个概念和GDB的frame模块
有关系,和inferior call功能没有实质联系。dummy frame只是为了考虑当目标程序进行
inferior call的时候,被中断(比如遇到断点或者信号),程序的frame看着依然正常。
如果把dummy frame从inferior call部分中去掉,没有任何实际影响,只是在有些情况下
,程序的stack backtrace 可能有些奇怪或者难以理解。

写得相当不错,这次更加清楚详细!!!

Other related posts: