首先, 我现在正在学习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}
那么,我该如何正确列出信息?
感谢〜
答案 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.