1.用脚本打印链表:
#include
struct A
{
int age;
char name[10];
struct A *next;
};
int main ()
{
char *names[10] = { "jack", "helen", "tom", "april", "xl", "wjm" };
struct A a[6];
int i = 0;
while (i < 6)
{
a[i].next = a + i + 1;
strcpy (a[i].name, names[i]);
a[i].age = i * 2;
i++;
}
a[i - 1].next = 0;
i = 10;
}
gdb中的方法如下:
直接在gdb状态下输入命令(也可以把命令写在一个文件中,到时用source加载运行,可以认为一个文件就是一个无参数的函数)
(gdb) set $p=a
(gdb) while $p!=0
>print $p->name
>echo $p->name
>print (char*)$p->name
>set $p=$p->next
>end
也可以使用用户自定义函数完成
define abc
set $p=a
while $p!=0
print $p->name
echo $p->name
print (char*)$p->name
set $p=$p->next
end
end
dbx中的调试脚本为:
1.可以像上面一样直接输入脚本.(包括函数体或者函数的全部内容)。
2.在一个临时文件中输入脚本.然后用. 或者source加载。
function a
{
p=$[&a];
while (($p != 0));
do
print $p;
echo $p;
print $[((struct A *) $p)->name];
echo $[((struct A *) $p)->name];
p=$[((struct A *) $p)->next];
done;
}
. 和source的区别是.使用的$PATH中查找文件。source在当前目录中查找,或者写全路径。如果代码分行写,可以不使用分号。如果全部写在一行,则必须加上分号。
$[]中的内容直接是c语言代码。 p=$[&a];表示获得a的地址,并保存在shell变量p中。
$p表示获得shell变量p的值,由于p不是c程序的部分,所以需要对其进行强行转化。
注意:
同样为while在gdb和dbx中却有不同:
(gdb) help while
Execute nested commands WHILE the conditional expression is non
zero.The conditional expression must follow the word `while' and must
in
turn be followed by a new line. The nested commands must be
entered one per line,and should be terminated by the word `end'.
(dbx 1) help while
while is a shell keyword
因此上面的语法不同,也就不足为怪了。
阅读(1960) | 评论(0) | 转发(1) |