【问题标题】:Visual Studio hangs on GetThreadWaitChain WCT callVisual Studio 挂起 GetThreadWaitChain WCT 调用
【发布时间】:2015-12-10 20:21:41
【问题描述】:

我正在尝试 WCT,我想调用 GetThreadWaitChain,我之前有一些关于这个主题的问题,但我最近有一些奇怪的行为。当我调用 GetThreadWaitChain 函数时,我的 Visual Studio 挂起并显示提示消息:

vhost32.exe 已停止工作

输出窗口消息:

The program '[9068] testWCT.vshost.exe' has exited with code -1073740940 (0xc0000374).

每次我使用该功能时,我的视觉工作室都会挂起......

GetThreadWaitChain 文档:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679364(v=vs.85).aspx

这是我的代码:

internal void CollectWaitInformation(ClrThread thread)
{
    var g_WctHandle = OpenThreadWaitChainSession(0, 0);

    uint threadID = thread.OSThreadId;

    WAITCHAIN_NODE_INFO[] NodeInfoArray = new WAITCHAIN_NODE_INFO[16];


    int isCycle = 0;
    int count = 16;

    // Make a synchronous WCT call to retrieve the wait chain.
    bool result = GetThreadWaitChain(g_WctHandle,
                            IntPtr.Zero,
                            WCTP_GETINFO_ALL_FLAGS,
                            threadID, ref count, NodeInfoArray, out isCycle);

    if (!result)
    {
        //error
    }

    //Finaly ...
    CloseSession(g_WctHandle);
}

[DllImport("Advapi32.dll")]
public static extern IntPtr OpenThreadWaitChainSession(OpenThreadChainFlags Flags, DWORD callback);

[DllImport("Advapi32.dll")]
public static extern bool GetThreadWaitChain(
    IntPtr WctHandle,
    IntPtr Context,
    UInt32 Flags,
    uint ThreadId,
    ref int NodeCount,
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)]
    [In, Out]
    WAITCHAIN_NODE_INFO[] NodeInfoArray,
    out int IsCycle
);

[StructLayout(LayoutKind.Sequential)]
public struct WAITCHAIN_NODE_INFO
{
    public WCT_OBJECT_TYPE ObjectType;
    public WCT_OBJECT_STATUS ObjectStatus;

    public struct LockObject
    {
        string ObjectName;
        LARGE_INTEGER Timeout;
        BOOL Alertable;
    }
    public struct ThreadObject
    {
        DWORD ProcessId;
        DWORD ThreadId;
        DWORD WaitTime;
        DWORD ContextSwitches;
    }
}

}

我尝试在同一个进程上运行 C++ 代码,该进程取自 MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681418(v=vs.85).aspx

我得到的只是:所有线程都出现 0x57 错误。根据 MSDN,这是 ERROR_INVALID_PARAMETER:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

这很奇怪,因为我没有更改 C++ 代码..

关于同一主题的上一个问题: WCT GetThreadWaitChain call allways return false

【问题讨论】:

  • 0xc0000374 是堆损坏错误代码。此代码中有大量内存损坏,您的 WAITCHAIN_NODE_INFO 声明不准确且太小。用字符串声明一个包含联合的结构非常有趣,而是在 C++/CLI 项目中这样做。
  • 你从哪里得到 0xc0000374 错误?
  • 你发的,被操作系统终止的进程的退出码就是异常码。
  • 我第一次看到 GC 堆损坏产生 0xc0000374。这通常会引发 ExecutionEngineException。必须是新的 .NET 4.6.x 行为。好吧,一个记录簿。

标签: c# visual-studio-2015 pinvoke freeze


【解决方案1】:

我以错误的方式声明了 WAITCHAIN_NODE_INFO 结构(我的联合错误)这是原始结构:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681422(v=vs.85).aspx

一旦我宣布正确,堆损坏就停止了,一切正常......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2015-02-27
    • 1970-01-01
    相关资源
    最近更新 更多