gdb学习5:打印函数堆栈和退出函数
原创
©著作权归作者所有:来自51CTO博客作者wx631a9cd48516d的原创作品,请联系作者获取转载授权,否则将追究法律责任
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *MyStrCopy1(const char *s1)
{
if(NULL == s1)
{
return "string is NULL";
}
else
{
char *s2 = (char *)malloc(strlen(s1)+1);
if(NULL == s2)
{
return "malloc error";
}
char *p = s2;
while((*s2++ = *s1++));
return p;
}
}
char *MyStrCopy2(const char *s1,char *s2)
{
char *p = s2;
while(*s2++ == *s1++);
//while(*s2++ = *s1++);
return p;
}
int main(int argv,char **argc)
{
const char *str1 = NULL;
const char *str2 = "string copying";
char str3[strlen(str2)+1];
//char str3[20];
printf("%s\n",MyStrCopy1(str1));
printf("%s\n",MyStrCopy1(str2));
char *res = MyStrCopy2(str2,str3);
printf("%s\n",res);
return 0;
}
编译运行:
gyz@debian:~/mc$ gcc strcopy.c -o strcopy -g -Wall
gyz@debian:~/mc$ gdb strcopy
直接进入新内容。
(gdb) bt
#0 main (argv=1, argc=0x7fffffffe228) at strcopy.c:41
(gdb) s
MyStrCopy2 (s1=0x555555554990 "string copying", s2=0x7fffffffe0c0 "\001")
at strcopy.c:27
27 char *p = s2;
(gdb) bt
#0 MyStrCopy2 (s1=0x555555554990 "string copying", s2=0x7fffffffe0c0 "\001")
at strcopy.c:27
#1 0x00005555555548bc in main (argv=1, argc=0x7fffffffe228) at strcopy.c:41
(gdb) finish
Run till exit from #0 MyStrCopy2 (s1=0x555555554990 "string copying",
s2=0x7fffffffe0c0 "\001") at strcopy.c:27
0x00005555555548bc in main (argv=1, argc=0x7fffffffe228) at strcopy.c:41
41 char *res = MyStrCopy2(str2,str3);
Value returned is $1 = 0x7fffffffe0c0 "\001"
(gdb) n
42 printf("%s\n",res);
(gdb)
解释:
1,bt(不知道这个是哪个单词的简写,知道的,请留言)可以打印函数堆栈,上面用s进入了函数MyStrCopy2(),可以看到bt打印的信息是层层递进的;
2,finish命令可以直接退出当前函数,不需要再用n一步一步的执行完再退出函数。