gdb简介
gdb是gcc的调试工具,主要用于C和C++这两种语言编写的程序,功能强大,主要体现在以下4点:
①启动程序,可以按照用户自定义的要求随心所欲地运行程序
②可让被调试的程序在指定的断点处停住
③当程序被停住时,可以检查此时程序运行的状态
④动态的干部程序的执行环境
要调试,必须在编译时,要将调试信息加到可执行文件中。使用编译器 -g参数可以做到
gcc -g hello.c -o hello
g++ -g hello.cpp -o hello
如果没有-g,则看不到程序的函数名,变量名,所替代的全是运行时的内存地址。
启动gdb的方法
1) gdb program
program也就是你的执行文件,一般在当前目录下
2)gdb program core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件
3)gdb program 1234
如果程序是一个服务程序,那么这个可以指定这个服务程序的的进程ID,gdb会自动attach操作
gdb常用命令
l: 列出函数代码及其行数
b 16: 在代码16行处设置断点
b func: 在函数func处设置断点
r: 运行程序
n: 单条执行语句
p i: 打印i变量的值
bt: 查看函数的堆栈
finish: 退出函数
q: 结束调试
用gdb分析coredump文件
core,又称为coredump文件,是UNIX/Linux操作系统的一种机制,出core的过程意味着服务暂时不能正常响应。
coredump文件的存储路径
通过下面的命令看到core文件的存在位置
cat /proc/sys/kernel/core_pattern
通过下面的命令更改coredump文件的存储位置,将core文件生成到/data/coredump/core目录下
echo “/data/coredump/core” > /proc/sys/kernel/core_pattern
通过修改kernel参数,可以指定内核生成coredump文件名,例如,使用下面的命令生成core.filename.pid格式
echo “/data/coredump/core.%e.%p” >/proc/sys/kernel/core_pattern
这样配置,产生的core文件带有崩溃的程序名,以及它的进程ID
产生coredump文件的条件
保证当前能生成coredump文件大小大于0
当前目录有对写入core目录的写权限和足够的空间
产生coredump文件的原因
产生coredump文件的原因
内存访问越界
①使用错误的下标。②字符串越界。③使用strcpy,strcat,sprintf,strcmp,strcasecmp等字符串操作函数,容易出现目标字符串读/写越界,应该使用strncpy,strlcpy,strncat等函数防止读写容易出现越界
多线程程序使用了线程不安全的函数
多线程读写的数据未加锁保护
对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则容易造成coredump
非法指针,包括使用空指针或随意使用指针转换
堆栈溢出
局部变量太大,容易造成堆栈溢出。