我有以下 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 $0x0 // 0
0x7d11 push $0x1000 // 512*8 = 4096 B
0x7d16 push $0x10000 // 64 KB
0x7d1b call 0x7cd1
我如何跳过这个函数?使用 si
的下一个命令只是让我进入 readseg
函数。我不想踏进去,而是跨过去。我尝试在下一个命令旁边放置一个断点:
b *0x7d21
c
但它永远不会回来......
我是否应该在不同的地址上设置断点?
我不确定。然而,这是一种解决方法,我宁愿使用我在文档here中找不到的step over命令。 .
最佳答案
si
的“跨步”类似物称为 nexti
(也缩写为 ni
)。这将单步执行单个汇编指令,但单步执行调用。
关于c - GDB单步执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004019/