黑客基础知识(3)
时间:2026-01-19
时间:2026-01-19
很棒
检查所调用的堆栈内容的复杂命令。下表列出了
你在用 gdb 调试时会用到的一些命令。
命令 描 述
file 装入想要调试的可执行文件
kill 终止正在调试的程序
list 列出产生执行文件的源代码的一部分
next 执行一行源代码但不进入函数内部
step 执行一行源代码而且进入函数内部
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变
break 在代码里设置断点, 这将使程序执行到这里时被挂起
make 使你能不退出 gdb 就可以重新产生可执行文件
shell 使你能不离开 gdb 就执行 UNIX shell 命令
gdb 应用举例
下面列出了将被调试的程序,这个程序被称为 greeting ,显示一个简单的问候, 再用反序将它列出
。
#include < stdio.h>
main ()
{
char my_string[] = “hello there”;
my_print (my_string);
my_print2 (my_string);
}
void my_print (char *string)
{
printf (“The string is %s”, string);
}
void my_print2 (char *string)
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
&nbs
p; string2[size+1] = `0';
printf (“The string printed backward is %s”, string2);
}
用下面的命令编译这个程序:
gcc -o -g test test.c
运行编译好的程序,显示如下:
The string is hello there
The string printed backward is
输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的。我们所设想的输出应该是:
The string printed backward is ereht olleh
由于某些原因, my_print2 函数没有正常工作。用 gdb 看看问题究竟出在哪儿, 先键入如下命令:
gdb greeting
如果在输入命令时忘了把要调试的程序作为参数传给 gdb ,可以在 gdb 提示符下用 file 命令来载
入它:
(gdb) file greeting
这个命令载入 greeting 可执行文件,就象在 gdb 命令行里指定启动gdb装入它一样。
这时就能用 gdb 的 run 命令来运行 greeting 了。 当它在 gdb 里被运行后结果大约会象这样:
(gdb) run
Starting program: /root/greeting
The string is hello there
The string printed backward is
Program exited with code 041
这个输出和在 gdb 外面运行的结果一样。问题是, 为什么反序打印没有工作? 为了找出症结所在,
我们可以在 my_print2 函数的 for
语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list