Linux程序设计 2013.pptVIP

  • 2
  • 0
  • 约1.42万字
  • 约 58页
  • 2016-09-12 发布于浙江
  • 举报
动态调试举例 调试指定程序(./my_app) 问题: 期望的输出和实际输出不一致 (gdb) file ./my_app Reading symbols from ./my_app...done (gdb) run Starting program: /home/tom/shell_script/cpp/my_app/my_app Your Name,Please:tom Hello ! Program exited normally. (gdb) 加载调试程序 启动调试程序 程序输出 提示信息 动态调试举例 初次错误定位: 输出有错误 错误定位 重新开始一次调试; 启动gdb; 加载调试程序(./my_app); 查看程序源代码 命令: list 文件名 动态调试举例 (gdb) list my_app.c:1,20 1 #include stdio.h 2 #include greeting.h 3 #define N 10 4 int main(void) 5 { 6 char name[N]; 7 printf(Your Name,Please:); 8 scanf(%s,name); 9 greeting(name); 10 return 0; 11 } (gdb) break 7 BreakPoint 1 at 0x8048384: file my_app.c, line 7. 在程序第7行设置断点 命令: (gdb) break 7 查看源代码 设置断点 提示信息 动态调试举例 错误详细定位 1 (gdb) run 2 Starting program: /home/tom/shell_script/cpp/my_app/my_app 3 Breakpoint 1,main() at my_app.c:7 4 7 printf(Your Name,Please:); 5 (gdb) next 6 8 scanf(%s,name); 7 (gdb) next 8 Your Name,Please:tom 9 9 greeting(name); 启动调试程序 断点激活 步进下一步 动态调试举例 10 (gdb) print name 11 $1 = “tom\000ò·000?? 12 (gdb) step 13 greeting(name=0xbfffdf20 “tom”)at functions/greeting.c:5 14 5 printf(”Hello !\r\n”); 15 (gdb) step 16 Hello ! 17 6 } 18 (gdb) kill 19 Kill the programe being debugged?(y or n)y 20 (gdb) quit 错误详细定位 查看变量值 进入函数内部 步进执行 停止调试 退出gdb 动态调试举例 分析: 11行说明name变量被正确赋值(tom) 13行说明name变量值被正确赋予greeting的参数变量name 16说明打印出现了错误,即错误出现在函数greeting中; 综合分析 错误出现在greeting.c的第5行; 原因: 没有输出字符串的格式不对; 改正错误 printf(Hello! %s\r\n,name); 动态调试举例 动态调试总结 主要错误类型: 算法错误; 输入错误; 定位方法: 设置断点; 单步步进执行; 查看变量取值变化; 反复执行,逐步缩小错误范围; * 如果目标名称为mytarget.so(image.o),则$@为mytarget.so,而$%为image.o 构建动态库 $gcc –fPIC –c message.c //”PIC”告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用 //编译出的文件message.o可以用于建立共享函数库 $gcc –shared –o libmessage.so message.o $gcc –o goodbye –lmessage –L. main.c $export LD_LIBRARY_PATH=`pwd` //制定额外的共享函数库搜索路径 $./goodbye /** message.c **/ #include?stdio.h ?? ?? void?goodbye_world(void) ?? { ?? ????????printf(Goodbye,?world!\n); }?? /** main.c **/ #include?stdlib.h

文档评论(0)

1亿VIP精品文档

相关文档