当单步执行特定代码行时,Visual Studio 调试器会默默地继续

问题描述 投票:0回答:1

我正在使用 Windows API 来获取

IAudioEndpointVolume
的句柄并注册
IAudioEndpointVolumeCallback
。我还有一个
IMMDeviceEnumerator
,其中包含
IMMNotificationClient
的注册回调,这样当默认设备更改时,我会释放
IAudioEndpointVolumeCallback
IAudioEndpointVolume
并存储新的。

但是,当释放

IAudioEndpointVolume
时,我的程序似乎在回调线程上无声地崩溃,没有任何异常或我可以看到的输出。即使在中断线路并尝试跳过时,它也会默默地继续,不会到达下一条语句,而且调试器也不会关闭。

if(_volumeEndPoint)
{
    if(_callback)
    {
        HRESULT hrUnReg = _volumeEndPoint->UnregisterControlChangeNotify(this);
        if(hrUnReg != S_OK)
        {
            std::cout << hrUnReg; // this reports successful
        }
    }

    _volumeEndPoint->Release(); // <--- cannot step over this line
    _volumeEndPoint = nullptr;
}

if(deviceEndPoint == nullptr)
{
    return;
}

我尝试过的事情:

  • 在“调试”->“Windows”->“异常设置”中启用所有异常
  • 添加 try/catch 所有异常

感觉这可能与不同线程上的回调有关?我不太精通 C++、WinAPI 和 COM 东西,所以几乎可以肯定我在做一些愚蠢的事情,但如果它能告诉我某种错误,那就太好了。

c++ visual-studio debugging winapi com
1个回答
0
投票

我也遇到了同样的问题,程序不是无声地崩溃,而是死锁!当程序无提示崩溃时,您可以检查 stace 跟踪,也许堆栈跟踪是这样的 silently crash stack trace

MSDN没有写任何关于它以及如何避免这种情况的内容,我尝试了很多次和很多方法来处理这个问题,但我失败了。

但是,我发现有两个规则你需要遵循,这个规则只适用于你所说的情况

RegisterControlChangeNotify

  1. 系统中任何设备只能由一个
    IMMDevice
    管理,您不能创建多个
    IMMDevice
    实例来管理该设备。
  2. IMMNotificationClient
    回调中,无法释放
    IMMDevice
    。您可以在另一个线程上释放实例。
© www.soinside.com 2019 - 2024. All rights reserved.