我正在使用 EDB 并逐步执行该程序,但我什至不知道这样做时的行为有何不同。如果我有希望对这个程序进行逆向工程,我觉得这是我应该知道的。
调试时 step into 和 step over 有什么区别?
逆向工程
艾达
拆卸
调试器
数据库
调试
2021-06-25 06:50:08
1个回答
该gdb
术语(和命令)是step
与next
和所不同的是step
继续运行,直到它改变的源代码行,而next
不会追踪到一个子程序,而是跳过它。的stepi
和nexti
命令是类似的,但在机器指令级,而不是源代码级进行操作。在精细手册中阅读更多内容。
这是一个可能有助于澄清的示例。假设您有一个包含三个简单文件的简单项目:
主文件
#include "squareit.h"
#include <stdio.h>
int main(void) {
int x = 5;
printf("%d squared is %d\n", x, squareit(x));
}
方格文件
#ifndef SQUAREIT_H
#define SQUAREIT_H
// return the square of an integer
int squareit(int x);
#endif // SQUAREIT_H
squareit.c
#include "squareit.h"
int squareit(int x) {
return x*x;
}
我们在启用调试标志的情况下编译程序 ( gcc -g main.c squareit.c -o simple
),然后运行gdb simple
. 如果我们坐在printf
线上执行step
,我们会发现自己在squareit()
函数中。相反,如果我们在同一点执行next
,则squareit()
函数和printf()
函数都将执行,我们将发现自己位于main()
.
会议如下:
(gdb) b main
Breakpoint 1 at 0x40113d: file ./main.c, line 5.
(gdb) run
Starting program: ./simple
Breakpoint 1, main () at ./main.c:5
5 int x = 5;
(gdb) step
6 printf("%d squared is %d\n", x, squareit(x));
(gdb) s
squareit (x=5) at ./squareit.c:4
4 return x*x;
(gdb) s
5 }
(gdb) s
5 squared is 25
main () at ./main.c:7
7 }
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: ./simple
Breakpoint 1, main () at ./main.c:5
5 int x = 5;
(gdb) s
6 printf("%d squared is %d\n", x, squareit(x));
(gdb) next
5 squared is 25
7 }
gdb
这里使用的命令是b
设置一个断点,s
它的别名为step
,next
(别名为n
)和run
(别名为r
)。
其它你可能感兴趣的问题