Linux开发环境介绍 简介(二) GDB & Memory Leakage Detection Tools Delivered By LiHao @founder(Shanghai) Introduction to Linux Dev Env. (Ser. 2) Debugging&Optimization.
目的: GDB --- 概述(Overview) 问题:当程序完成编译,链接并生成可执行的目标文件后,如果出现结果与预期的不同时,怎么办? 解决方法: GDB GDB作用: 免费的Unix/Linux平台下的调试工具。
GDB --- 使用(Usage) 下面就开始我们的GDB之旅 前置条件 启动/退出GDB 调试程序 在我们对我们程序调试之前,要保证我们的程序含有debug信息,即保证g++/gcc使用-g 参数对源码进行编译。 启动/退出GDB 在unix/linux的 prompt模式下 输入:gdb 进入调试状态。 在gdb状态下,输入quit,或者 ctrl+d , 退出调试状态。 调试程序 gdb executable 对 executable进行调试。 gdb executable core 对 executable进行调试,并使用core dump信息。
GDB --- 使用(Usage) 问题:如果我们的程序需要我们在执行的时候提供相应的输入参数时,怎么对其进行调试? 解决方法: gdb executable pid 对当前进程ID为 pid的executable程序进行调试。 问题:如果我们的程序需要我们在执行的时候提供相应的输入参数时,怎么对其进行调试? 解决方法: 启动gdb时对其设置。 gdb executable agrs1 args2… argsN 在gdb状态下使用set args命名对其参数进行设置。 set args args1 args2 … argsN show args 查看所设置的参数情况。 show args
GDB --- 使用(Usage)之常用参数介绍 -symbols file , -s file ,从所指定的文件file文件中读取符号表。 -exec file –e file, 指定可执行文件。 -core file –c file 指定core dump 文件。 使用ulimit –c unlimited 来打开core dump文件,默认系统不产生core dump文件 -pid num –p num 链接到进程号为num的进程上,同attach命令。 -directory dir –d dir 指定gdb所搜寻的目录。
GDB --- 使用(Usage)之常用参数介绍 gdb日志系统,用来保存gdb命令执行时候的输出,可以将其重定向到一个文件系统中。 set logging on 打开日志系统 set logging off 关闭日志系统 set logging file filename 将日志重定向到filename中。 show logging 显示当前日志参数的当前状态。 set logging overwirte [on|off] set logging redirect [on|off] Tips: 在gdb使用的过程中可以使用tab/M-?键来对命令进行补齐。
GDB --- 使用(Usage)之常用参数介绍 run/ r 运行所调试的程序。 设置/查看当前所运行的环境情况。 path directory 将路径directory添加到环境变量PATH中。 show paths 查看环境变量PATH的值。 设置/取消设置/查看环境变量 set environment|env varname[=value] 设置环境变量的值。 show env 查看环境变量的值 unset env varname 取消对环境变量varname的设置。 附加/断开到一进程 attach pid detach
GDB --- 使用(Usage)之常用参数介绍 设置断点(break/b) b (break) filename:lineNum 在filename的第lineNum行上设置断点 b (break) 在下一条指令上设置断点 b (break) filename:function_name 在filename的中function_name函数上设置。 b (break) linenum thread threadNum 在指定的线程上设置断点 b (break) linenum thread threadNum if … 在指定线程的特点条件上 设置/查看当前的堆栈信息/调用信息(frame/f) frame args 设置跳转到的堆栈编号,如果args为空,则查看当前的堆栈信息 frame n 堆栈信息的查看 f n up/down n Info f
GDB --- 使用(Usage)之常用参数介绍 backtrace (bt) 显示所有的调用堆栈信息。 bt (+/-)n 显示最近/最早的n 层调用信息。 bt full 显示最近所有的调用信息并打印出局部变 量的情况 where, info stack, info s 与上述的bt命令具有相同的功能。 查看源码 (list/l) list linenum 查看 linenum附近的源代码。 list function 查看function附近的源代码。 list 查看源码。 list first,last 看看(first , last)内源码。
GDB --- 使用(Usage)之常用参数介绍 查看变量 (print/p) print expr/var 输出当前表达式或变量的值。 p file::var 输出变量的值。 p function::var
Valgrind 内存泄露检测(Unix/Linux) 问题:当编译,链接,运行均正确后,是否意味着我们的程序是一个合格的程序? 答案:不竟然,衡量一个程序的好坏有很多的指标,其中一个是内存管理的情况。 Valgrind 就是一个检测我们对于内存管理情况的工具。 什么是内存泄露? 就是我们向系统申请内存后,没有正确的释放我们所获取的内存,从而导致系统内存越来越少,最后,出现无法申请到有效的内存。 一般的内存管理方式 malloc /free new/delete 当这两对函数不成对出现时,意味着我们的程序出现了内存泄露
Valgrind 内存泄露检测(Unix/Linux) 如何获得? Google 如何安装? Google Read manual (一般步骤是:解压 tar-xvf xxx.tar, 运行configure, make, make install)
Valgrind 内存泄露检测(Unix/Linux) valgrind [valgrind-options] your-prog [your-prog-options] 如需要检测内存泄露加上参数 --leak-check=yes Valgrind 参数两类 core 的参数,它对所有的工具都适用; 具体某个工具如 memcheck 的参数。 Valgrind 默认的工具就是 memcheck,也可以通过“--tool=tool name”指定其他的工具 更多的见手册
Valgrind 内存泄露检测(Unix/Linux) Comes from :http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/
Valgrind 内存泄露检测(Unix/Linux) 使用未初始化内存 例如:a[5],定义但未对其进行初始化,就使用。 内存读写越界 例如:char* pt=malloc (5) , 此时使用*(pt+6). 内存覆盖 例如:strcpy, strncpy, memcpy, strcat源地址,目的地址有重复。 动态内存管理错误 Malloc/free, new/delete 不配对。
Q&A