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)。这将单步执行单个汇编指令,但会跳过调用。