麻省理工学院jos实验室,如何在bootmain()设置断点

时间:2017-10-24 04:13:47

标签: debugging operating-system gdb breakpoints

首先, 我现在正在学习MIT-jos

的操作系统实施

我想跟踪位于boot / main.c中的 bootmain(void)

但我不知道如何在那里设置断点,

我将gdb源目录设置为boot和obj / boot

(gdb) dir boot:obj/boot
Source directories searched:     
/home/osdi/lab/boot:/home/osdi/lab/obj/boot:$cdir:$cwd

当我在bootmain(void)设置断点时, gdb抱怨:

(gdb) b bootmain
Function "bootmain" not defined.
Make breakpoint pending on future shared library load? (y or [n]) 

那么,如何在bootmain上正确设置断点(void?)

其次, 我只能按地址设置断点

(gdb) b *0x7c00
Breakpoint 1 at 0x7c00

但是当我想列出代码时,gdb再次抱怨“没有这样的文件或目录”

[   0:7c00] => 0x7c00:  cli    
Breakpoint 1, 0x00007c00 in ?? ()
(gdb) list
1   {standard input}: No such file or directory.
    in {standard input}

那么,我该如何正确列出信息?

感谢〜

2 个答案:

答案 0 :(得分:0)

追踪boot/boot.asm

call bootmain
    7c45: e8 c0 00 00 00 call 7d0a <bootmain>

Bootmain函数从 0x7d0a

开始

答案 1 :(得分:0)

最近遇到同样的问题,谷歌搜索了一段时间,但没有运气的解决方案。阅读gdb输出和实验指南,找到根本原因。

事实证明,您需要将符号文件设置为 boot ,然后一切正常。请参阅以下gdb输出。在“ +符号文件obj / kern / kernel ”行中,我们可以看到默认情况下它使用 kernel 作为符号文件。由于bootmain()位于 boot 中,所以我们需要切换到 boot 符号文件。

我已在此blog中对其进行了总结。

The target architecture is assumed to be i8086
[f000:fff0]    0xffff0: ljmp   $0xf000,$0xe05b
0x0000fff0 in ?? ()
+ symbol-file obj/kern/kernel

(gdb) symbol-file obj/boot/boot.out
Load new symbol table from "obj/boot/boot.out"? (y or n) y
Reading symbols from obj/boot/boot.out...done.
(gdb) b bootmain
Breakpoint 1 at 0x7d15: file boot/main.c, line 40.
(gdb) c
Continuing.