GDB跨越命令
我有以下C代码:
#include #include #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
以上2个命令: b
放置断点, c
运行直到达到断点。
我可以看到我按预期0x7d0a
在0x7d0a
。 然后在几个命令后,我可以看到函数参数被推送到堆栈作为参数。 并呼吁readseg
。
0x7d0f push $0x0 // 0 0x7d11 push $0x1000 // 512*8 = 4096 B 0x7d16 push $0x10000 // 64 KB 0x7d1b call 0x7cd1
我的问题是:我如何单步执行此function? 使用si
下一个命令只是让我进入readseg
函数。 我不想介入,而是要跨过去。 我尝试在下一个命令下面设置一个断点:
b *0x7d21 c
但它永远不会回归……
也许我应该在不同的地址上设置断点? 不确定。 然而,这是一种解决方法,我宁愿使用步骤命令,我在这里的文档中找不到。
si
的“跨越”类似物称为nexti
(也缩写为ni
)。 这将执行单个汇编指令,但跳过调用。