GDB 跳过命令
GDB step over command
我有以下 C 代码:
#include <inc/x86.h>
#include <inc/elf.h>
#define SECTSIZE 512
#define ELFHDR ((struct Elf *)0x10000) // Scratch space
void readsect(void*, unit32_t);
void readsec(uint32_t, uint32_t, uint32_t);
void bootmain(void)
{
struct Proghdr *ph, *eph;
// Read the first page off disk
readseg((uint32_t) ELFHDR, SECTSIZE*8, 0);
.
. // The rest of the code
.
}
我正在使用 GDB 进入我的代码并查看发生了什么。
我找到了bootmain的地址0x7d0a
,并在那里设置了一个断点。
b *0x7d0a
c
以上两条命令:b
添加断点,c
运行到断点
我可以看到我按预期停在 0x7d0a
。
然后在几个命令之后,我可以看到函数参数作为参数被压入堆栈。并呼吁 readseg
.
0x7d0f push [=12=]x0 // 0
0x7d11 push [=12=]x1000 // 512*8 = 4096 B
0x7d16 push [=12=]x10000 // 64 KB
0x7d1b call 0x7cd1
如何跳过这个函数?使用 si
的下一个命令只是让我进入 readseg
函数。我不想踏进去,而是想跨过去。我尝试在下一个命令旁边放置一个断点:
b *0x7d21
c
但它从来没有 returns...
我是否应该在其他地址上设置断点?
我不确定。然而,这是一种解决方法,我宁愿使用我在文档 here.
中找不到的 step over 命令
si
的 "step over" 类似物称为 nexti
(也缩写为 ni
)。这将单步执行单个汇编指令,但会跳过调用。
我有以下 C 代码:
#include <inc/x86.h>
#include <inc/elf.h>
#define SECTSIZE 512
#define ELFHDR ((struct Elf *)0x10000) // Scratch space
void readsect(void*, unit32_t);
void readsec(uint32_t, uint32_t, uint32_t);
void bootmain(void)
{
struct Proghdr *ph, *eph;
// Read the first page off disk
readseg((uint32_t) ELFHDR, SECTSIZE*8, 0);
.
. // The rest of the code
.
}
我正在使用 GDB 进入我的代码并查看发生了什么。
我找到了bootmain的地址0x7d0a
,并在那里设置了一个断点。
b *0x7d0a
c
以上两条命令:b
添加断点,c
运行到断点
我可以看到我按预期停在 0x7d0a
。
然后在几个命令之后,我可以看到函数参数作为参数被压入堆栈。并呼吁 readseg
.
0x7d0f push [=12=]x0 // 0
0x7d11 push [=12=]x1000 // 512*8 = 4096 B
0x7d16 push [=12=]x10000 // 64 KB
0x7d1b call 0x7cd1
如何跳过这个函数?使用 si
的下一个命令只是让我进入 readseg
函数。我不想踏进去,而是想跨过去。我尝试在下一个命令旁边放置一个断点:
b *0x7d21
c
但它从来没有 returns...
我是否应该在其他地址上设置断点?
我不确定。然而,这是一种解决方法,我宁愿使用我在文档 here.
中找不到的 step over 命令si
的 "step over" 类似物称为 nexti
(也缩写为 ni
)。这将单步执行单个汇编指令,但会跳过调用。