gdb是linux下一款功能强大的调试工具,windows下对应的有windbg,下面举例说明常见程序错误解决方法

1.gdb启动

要想使用gdb调试,编译时指定-g选项加入调试信息,gdb可以启动执行文件,attach正在运行程序,调试程序崩溃产生core文件

启动gdb后输入run运行,continue继续,quiet退出,下面是调试一段崩溃和死锁的源码

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h> pthread_mutex_t mutex; int count = 0;
void print_pid_tid()
{ pid_t   pid; pthread_t   tid; pid = getpid(); tid = pthread_self(); printf("pid %u tid %u (0x%x)\n", (unsigned int)pid, (unsigned int)tid, (unsigned int)tid);
} void callback_func()
{pthread_mutex_lock(&mutex); printf("count:%d\n",count);
}void *thread_func1(void *arg)
{ while (1){int n = *((int *)arg);pthread_mutex_lock(&mutex); print_pid_tid(); count += 2;for (int i=0 ; i < 5; ++i ) {count += n;} callback_func();pthread_mutex_unlock(&mutex); sleep(1);}return 0;
}
void *thread_func2(void *arg)
{while (1){pthread_mutex_lock(&mutex); printf("thread_func2 run\n");pthread_mutex_unlock(&mutex); sleep(1);}return 0;
}
void *thread_func3(void *arg)
{while(1){char *str = NULL;//strcpy(str,"hello world");sleep(1);}return 0;
}int main(void)
{ pthread_t ntid; int count = 10; pthread_mutex_init(&mutex, NULL); int err = pthread_create(&ntid, NULL, thread_func1, &count); if ( 0 != err ) { printf("pthread_create1:%s\n", strerror(err)); } err = pthread_create(&ntid, NULL, thread_func2, &count); if ( 0 != err ) { printf("pthread_create2:%s\n", strerror(err)); }err = pthread_create(&ntid, NULL, thread_func3, &count); if ( 0 != err ) { printf("pthread_create3:%s\n", strerror(err)); }getchar();int **ret = NULL; pthread_join(ntid, (void**)ret); printf("pthread_join:%p\n", *ret); pthread_mutex_destroy(&mutex); return 0;
} 

2.调试崩溃

gdb绑定程序运行崩溃时,gdb会停留在程序最后运行栈位置,一般输入bt查看堆栈,frame n切换栈帧,print打印是否空指针导致崩溃,where查看对于源码位置或者list列出源代码,崩溃一般有空指针,数组越界,内存非法访问

3.调试死锁

程序出现死锁时会是卡死状态,如果gdb绑定运行使用ctrl+c中断程序,输入info threads查看所有线程,使用thread n切换线程,在线程中输入bt查看线程堆栈,定位程序停留位置,一般比较多个线程锁或者是否有死循环

4.断点调试

设置断点,如b main.cpp:31,执行到断点后next单步,step进入函数,continue继续运行

linux下使用gdb调试崩溃和死锁实例相关推荐

  1. linux中多进程调试,linux下用gdb调试多进程

    今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表: 这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的. 一.多进程调试的命令 1.set follo ...

  2. Linux 下使用 gdb 调试 core 文件

    1.core文件 当程序运行过程中出现段错误(Segmentation Fault),程序将停止运行,由操作系统把程序当前的内存状况存储在一个 core 文件中,即核心转储文件(Coredump Fi ...

  3. Linux下的gdb调试makefile的编写

    1.gdb调试 gdb就是用于调试可执行文件,要想让程序在调试的时候有提示信息在生成文件时加上-g (1)启动gdb:gdb +包含调试信息的应用程序 (2)l(只能查询包含在可执行程序里边的.c文件 ...

  4. Linux下用GDB调试程序崩溃错误

    首先开启选项允许系统在程序崩溃时自动生成core dump文件 ulimit -c unlimited 编写测试程序test.c void main(void) {     int * p = 0; ...

  5. LINUX下的gdb调试方法

    首先对目标文件进行编译 例如: gcc test.c -o test 这时会生成一个文件test,然后我们就可以对test进行调试了 示例: gdb test 好了以后是设定断点 示例: break ...

  6. linux下的gdb调试

    对于意外dump掉的程序,我们可以用coredump工具,检查具体信息. 如下用法:

  7. linux下 如何调试php,linux下使用gdb对php源码调试

    title: linux下使用gdb对php源码调试 date: 2018-02-11 17:59:08 tags: --- linux下使用gdb进行php调试 调试了一些php的漏洞,记录一下大概 ...

  8. Linux下使用GDB进行调试

    Linux下使用GDB进行调试的常用命令记于此. $ sudo su # g++ -g test.cpp -o test -pthread # gdb test         <------- ...

  9. 一份简单的在 Linux下编译及调试 C 代码的指南

    摘要: 一份简单的在 Linux下编译及调试 C 代码的指南 对于Linux下的C程序员来说,几乎天天都会和Linux打交道.但在很多人的眼中,Linux是一个易用性极差.靠命令驱动的操作系统,根本无 ...

最新文章

  1. poj1273(最大网络流问题模版)
  2. c语言查找功能的怎么使用方法,求C语言实现查询功能(如果选择3,如何实现查询)...
  3. hiho一下第128周 后缀自动机二·重复旋律5
  4. php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能
  5. 信息学奥赛一本通C++语言——1078:求分数序列和
  6. 字符串解析成easyui-tree的格式
  7. ChaiNext:过去24小时比特币向底部试探
  8. Java7和8在虚拟机上的差异:Perm Generation vs. Metaspace
  9. 【收藏】机器学习与深度学习核心知识点总结
  10. 并发相关随笔(持续更新)
  11. 微信小程序图片宽高自适应
  12. Android开发——电话簿
  13. wh计算公式_阀门扭矩计算公式
  14. Linux常用命令大全(非常全!!!)
  15. 经济日报pdf批量下载整合
  16. CSS样式之实现水平排列块元素的几种方式
  17. 稀疏矩阵CSR存储的C++实现
  18. 使用opencv直接打开云钥GigE网络工业相机
  19. 计算机无法连接iphone,iTunes不识别iPhone?iTunes无法连接iPhone怎么办
  20. 液晶电视的MEMC(运动画质补偿技术)的优势不足

热门文章

  1. 办公室计算机网络使用情况,企事业单位办公网络的现状及解决方案.doc
  2. Spring学习6之自动装配Bean02
  3. hibernate mysql 模糊查询_服务器-hibernate操作mysql,模糊查询时中文查不到,数字和英文可以查到...
  4. 【Linux】22.当前运行的docker修改环境后,想在本地保存为镜像的方法
  5. mysql的最佳索引攻略
  6. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解
  7. 如何完成从科研人员到初创企业 CEO 的转型?
  8. 你在发表理科学术文章过程中有哪些经验值得借鉴
  9. Stanford UFLDL教程 稀疏编码自编码表达
  10. Stanford UFLDL教程 卷积特征提取