[原]调试实战——使用windbg调试DLL卸载时的死锁

本文详细记录了一次针对程序退出时因卸载DLL导致的死锁问题的调试过程。通过分析关键代码和调用栈,揭示了主线程与子线程在关键段上的等待循环,导致的死锁现象。提醒开发者避免在DLL卸载过程中等待线程结束,并推荐了相关调试技术和书籍资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近我们的程序在退出时会卡住,调查发现是在卸载dll时死锁了。大概流程是这样的:我们的dll在加载的时候会创建一个工作线程,在卸载的时候,会设置退出标志并等待之前开启的工作线程结束。为了研究这个经典的死锁问题,写了一个模拟程序,用到的dump文件及示例代码参考附件。

{% note info %}

这也是几年前在项目中遇到的一个问题,我对之前的笔记进行了整理重新发布于此。

{% endnote %}

关键代码

主程序 WaitDllUnloadExe

//WaitDllUnloadExe.cpp
#include "stdafx.h"
#include "windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE module = LoadLibraryA(".\\DllUnload.dll");

    Sleep(5000);

    FreeLibrary(module);

    return 0;
}

DLL程序 DllUnload

// dllmain.cpp
#include "stdafx.h"
#include "process.h"
HANDLE g_hThread;
bool g_quit = false;
unsigned __stdcall procThread(void *)
{
    while ( !g_quit )
    {
        OutputDebugStringA("procThread running.\n");
        Sleep(100);
    }

    OutputDebugStringA("==========================procThread quitting.\n");
    return 0;
}

unsigned __stdcall quitDemoProc(void *)
{
    int idx = 0;
    while ( idx++ < 5 )
    {
        OutputDebugStringA("quitDemoProc running!!!!!!!!.\n");
        Sleep(100);
    }

    OutputDebugStringA("--------------------------------------------------quitDemoProc quitting.\n");
    return 0;
}


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值