在Linux上,执行有多线程的程序时,当程序执行退出操作时有时会遇到卡死现象,如果程序模块多,代码量大,很难快速定位,此时可试试gdb attach方法。

测试代码main.cpp如下,这里为了使程序退出时产生卡死现象,在第51行时push线程sleep 100分钟:

#include <stdio.h>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <chrono>namespace {class Queue {
public:Queue() = default;~Queue() { }void Init(int num) {for (int i = 0; i < num; ++i) {queue_.push(i);}}int Pop() {std::unique_lock<std::mutex> lck(mutex_);while (queue_.size() == 0) {cv_.wait(lck);}int value = queue_.front();queue_.pop();return value;}void Push(int value) {std::unique_lock<std::mutex> lck(mutex_);queue_.push(value);cv_.notify_all();}private:std::queue<int> queue_;std::mutex mutex_;std::condition_variable cv_;
}; // class Queuebool running = false;void push(Queue& q) {int value = 100;while (running) {q.Push(value++);std::this_thread::sleep_for(std::chrono::minutes(100));}
}void pop(Queue& q) {while (running) {fprintf(stdout, "pop value: %d\n", q.Pop());std::this_thread::sleep_for(std::chrono::seconds(1));}
}} // namespaceint main()
{fprintf(stdout, "test start\n");Queue q;q.Init(2);running = true;std::thread th1(push, std::ref(q));std::thread th2(pop, std::ref(q));std::this_thread::sleep_for(std::chrono::seconds(10));running = false;th1.join();th2.join();fprintf(stdout, "test end\n");return 0;
}

build.sh脚本内容如下:

g++ -g -std=c++11 -o main main.cpp -lpthread
./main

执行:$ ./build.sh ,执行结果如下,程序无法正常退出,产生卡死现象:

通过命令:$ ps -aux | grep main ,获取执行main的进程(pid),如下图所示,执行main的进程为18786:

启动gdb attach,执行gdb attach pid即可调试正在运行的程序,执行:$ gdb attach 18786,若执行gdb attach时提示:” ptrace: Operation not permitted”,则执行:$ sudo gdb attach 18786,如下图所示:

也可执行:$ gdb main 18786,与gdb attach 18786相同。

常用的命令如下:

1. bt:查看函数调用栈的所有信息,当程序执行异常时,可通过此命令查看程序的调用过程;

2. info threads:显示当前进程中的线程;

3. thread id:切换到具体的线程id,一般切换到具体的线程后再执行bt等操作。

首先执行info threads,发现共有3个线程,当前线程id是1,即主线程,执行bt,会发现程序卡在第77行,即th1.join()语句上,即在push函数内没有退出;执行thread 2,再执行bt,发现此线程在执行pop函数,卡在了第24行的cv_.wait(lck)语句上;执行thread 3,再执行bt,发现此线程在执行push函数,卡在了第51行的std::this_thread::sleep_for(std::chrono::minutes(100));语句上,分析完成,了解了程序卡死的原因,执行结果如下图所示:

GitHub:https://github.com/fengbingchun/Messy_Test

Linux下gdb attach的使用(调试已在运行的进程)相关推荐

  1. linux单步调试方法,linux下gdb单步调试(中).doc

    linux下gdb单步调试(中) linux下gdb单步调试(中) linux下gdb单步调试(中) 一.设置断点( BreakPoint ) 我们用 break 命令来设置断点.正面有几点设置断点的 ...

  2. linux下gdb调试方法和技巧详解

    linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...

  3. linux常用调试,linux下gdb常用的调试命令

    用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法.接下来是小编为大家收集的linux下gdb常用的调试命令,希望能帮到大家. linux下gdb常用的调试命令 ...

  4. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  5. linux gdb网络调试,一文入门Linux下gdb调试(二)

    本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...

  6. LINUX下GDB调试

    LINUX下GDB调试 (gdb) p result[2]=33 $5 = 33 (gdb) p printf("result[2]=%d\n", result[2]) resul ...

  7. Linux下C程序的编辑,编译和运行以及调试

                                                                                                        ...

  8. linux下如何产生core,调试core

    linux下如何产生core,调试core 摘自:http://blog.163.com/redhumor@126/blog/static/19554784201131791239753/ 在程序不寻 ...

  9. linux下使用VS CODE + CMAKE 调试C++程序

    Linux下使用VS Code + CMake 调试c++程序 - 灰信网(软件开发博客聚合)

最新文章

  1. 十问陆奇:努力、能力和机遇,谁能帮你跑赢未来?
  2. R语言可视化学习笔记之ggridges包
  3. Arduino编程之Serial.println()和Serial.print()
  4. DellEMC品牌正式启用50%是上一代的R730对比R74
  5. 解决ubuntu中连接mysql时报错:Access denied for user ‘root‘@‘localhost‘
  6. KD Tree的原理及Python实现
  7. 浏览器窗口尺寸clientHeight / scrollHeight / offsetHeight / innerHeight
  8. list和对象数据复制CopyUtil工具类
  9. 第一行代码(第二版)全书代码下载
  10. SpringMVC之RequestHeader注解与CookieValue注解详解
  11. c语言五子棋人机对弈算法_从零开始编写C语言五子棋程序1
  12. 记一次Ubuntu安装nodeJs过程
  13. 密码学Cryptology
  14. VUE-地区选择器(V-Distpicker)
  15. 0055-空气质量检测
  16. OA协同办公系统未来的趋势
  17. 腾讯企业邮箱服务器地址和端口号备忘
  18. License information could not be obtained from Elasticsearch due to Error: Request Timeout after 300
  19. 笔记本外接显示器没有声音
  20. 小程序“Mustache”语法{{}}(双大括号)获取不到值或图片

热门文章

  1. Windows安装用于OCR的Tesseract及使用命令行参数进行OCR
  2. 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”
  3. 基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇4:PC应用开发)
  4. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
  5. MATLAB判断三角形成立的编程,Triangulation 划分三角形网络时用到的大量算法和测试例程 matlab 259万源代码下载- www.pudn.com...
  6. java avl_Java底层实现AVL 平衡二叉树
  7. 【longPressKey】长按键盘任意键(或组合键)3秒触发自定义事件(以Pause/Break键为例)
  8. vue下轻松解决模拟微信视频缩略图拖拽→吸附窗口边界的功能
  9. 在CentOS 6.9 x86_64上玩转OpenResty 1.13.6.1中的resty-cli模块
  10. 在CentOS 6.3 64bit上安装MySQL for python模块