在调试linux0.11的过程中,出现缺页中断,具体信息是
program received signal 0, Signale 0.
0x0000a0ec in page_fault().
这给调试带来很大的麻烦
关于这个问题,有个网友说了个方法:
忽略信号-“signal 0”
我也出现了这样的问题,不过现在解决了。
1)进入linux-gdb-rh9/ ,运行.run
2)
进入linux-gdb-rh9/ ,cd linux 进入linux目录
3)运行 gdb tools/system
错误的原因可能是 gdb tools/system 不是在linux-gdb-rh9目录下
我用一段时间研究gdb的源码,发现可以通过修改gdb源码来解决这个问题:
我修改的源码是"gdb-6.6",下载压缩包后解压(我解压到目录/opt/gdbdebug下),在目录/opt/gdbdebug下会有个文件夹"gdb-6.6",打开文件"/opt/gdbdebug/gdb-6.6/gdb/infrun.c",在3387行插入如下代码:
//开始
define BOCHDB
//如果gdb需要忽略signal 0,就定义宏BOCHDB,否则将些行释掉恢复原来的样子
#ifdef BOCHDB
//如果定义了BOCHDB就检查信号是否为0 (signal 0)if(0==atoi (*argv))
{
sigs[0] = 1;//如果是信号0,置位sigs[0],使SET_SIGS和UNSET_SIGS对"signal 0"的设置生效
goto igocontinue;
//然后跳过函数"enum target_signal target_signal_from_command (int num)"的检查
//必须跳过,否则发生异常
}
#endif
//结束
在"sigfirst = siglast = (int)target_signal_from_command (atoi (*argv));"下(3389行)插入代码
//开始
igocontinue:
//结束
之后文件从3379行到3398行的内容像下面的样子:
else if (digits > 0)
{
/* It is numeric.
The numeric signal refers to our own
internal signal numbering from target.h, not to host/target
signal
number.
This is a feature; users really should be
using symbolic names anyway, and the common ones like
SIGHUP, SIGINT, SIGALRM, etc. will work right anyway.
*/
#define BOCHDB
#ifdef BOCHDB
if(0==atoi (*argv))
{
sigs[0] = 1;
goto igocontinue;
}
#endif
sigfirst = siglast = (int)
target_signal_from_command (atoi (*argv));
//检查要设置的信号是否为1-15
igocontinue:
if ((*argv)[digits] == '-')
然后编译:make.
在调试的时候,使用命令"handle 0 nostop noprint"使gdb忽略signal 0.这样就不会出现"Program received signal 0, Signal 0"了