GDB跨越命令

时间:2017-03-24 15:56:45

标签: c operating-system gdb bootloader att

我有以下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 1st page off disk
    readseg((uint32_t) ELFHDR, SECTSIZE*8, 0);
    .
    .  // REST OF CODE
    .
}

我正在使用gdb来介入我的代码,看看发生了什么。
我找到了bootmain 0x7d0a的地址,并在那里放了一个断点。

b *0x7d0a
c

以上两个命令:b将断点和c运行直到达到断点。

我可以看到我按预期停留在0x7d0a。 然后在几个命令后,我可以看到函数参数被推送到堆栈作为参数。并致电readseg

0x7d0f push $0x0      // 0
0x7d11 push $0x1000   // 512*8 = 4096 B
0x7d16 push $0x10000  // 64 KB
0x7d1b call 0x7cd1 

我的问题是:我如何单步执行此功能?使用si的下一个命令只是让我进入readseg函数。我不想介入,但要走出去。我尝试在下一个命令下面设置一个断点:

b *0x7d21
c

但它永远不会回来......

也许我应该在不同的地址上设置断点?不确定。然而,这是一种方法,我宁愿使用我在文档here中找不到的步骤命令。

1 个答案:

答案 0 :(得分:0)

si的“跨越”类似称为nexti(也缩写为ni)。这将执行单个汇编指令,但会逐步调用。