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 可能有些奇怪或者难以理解。
写得相当不错,这次更加清楚详细!!!