日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時(shí)間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下gdb attach的使用(调试已在运行的进程) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在Linux上,執(zhí)行有多線程的程序時(shí),當(dāng)程序執(zhí)行退出操作時(shí)有時(shí)會(huì)遇到卡死現(xiàn)象,如果程序模塊多,代碼量大,很難快速定位,此時(shí)可試試gdb attach方法。

測(cè)試代碼main.cpp如下,這里為了使程序退出時(shí)產(chǎn)生卡死現(xiàn)象,在第51行時(shí)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腳本內(nèi)容如下:

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

執(zhí)行:$ ./build.sh ,執(zhí)行結(jié)果如下,程序無法正常退出,產(chǎn)生卡死現(xiàn)象:

通過命令:$ ps -aux | grep main ,獲取執(zhí)行main的進(jìn)程(pid),如下圖所示,執(zhí)行main的進(jìn)程為18786:

啟動(dòng)gdb attach,執(zhí)行g(shù)db attach pid即可調(diào)試正在運(yùn)行的程序,執(zhí)行:$ gdb attach 18786,若執(zhí)行g(shù)db attach時(shí)提示:” ptrace: Operation not permitted”,則執(zhí)行:$ sudo gdb attach 18786,如下圖所示:

也可執(zhí)行:$ gdb main 18786,與gdb attach 18786相同。

常用的命令如下:

1. bt:查看函數(shù)調(diào)用棧的所有信息,當(dāng)程序執(zhí)行異常時(shí),可通過此命令查看程序的調(diào)用過程;

2. info threads:顯示當(dāng)前進(jìn)程中的線程;

3. thread id:切換到具體的線程id,一般切換到具體的線程后再執(zhí)行bt等操作。

首先執(zhí)行info threads,發(fā)現(xiàn)共有3個(gè)線程,當(dāng)前線程id是1,即主線程,執(zhí)行bt,會(huì)發(fā)現(xiàn)程序卡在第77行,即th1.join()語(yǔ)句上,即在push函數(shù)內(nèi)沒有退出;執(zhí)行thread 2,再執(zhí)行bt,發(fā)現(xiàn)此線程在執(zhí)行pop函數(shù),卡在了第24行的cv_.wait(lck)語(yǔ)句上;執(zhí)行thread 3,再執(zhí)行bt,發(fā)現(xiàn)此線程在執(zhí)行push函數(shù),卡在了第51行的std::this_thread::sleep_for(std::chrono::minutes(100));語(yǔ)句上,分析完成,了解了程序卡死的原因,執(zhí)行結(jié)果如下圖所示:

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

總結(jié)

以上是生活随笔為你收集整理的Linux下gdb attach的使用(调试已在运行的进程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。