CaptureDumpFileOnDevice返回0并且GetLastError = ERROR_INVALID_PARAMETER(87)

时间:2016-02-02 13:07:20

标签: c# windows dump

我的.Net应用程序在windows ce 6上运行(在Toradex上)。 有时它会卡住,我想创建一个转储文件。 我创建了一个调用

的应用程序
CaptureDumpFileOnDevice(DWORD dwProcessId, DWORD dwThreadId, LPCWSTR pwzExtraFilesPath)

但它始终返回0GetLastError = ERROR_INVALID_PARAMETER。即使我为0传递值Ids(表示当前进程和当前线程),也为路径传递null。

我在注册表中找不到相关的密钥(请参阅https://msdn.microsoft.com/en-us/library/aa526063.aspx),因此我添加了' DumpDirectory'并且' DontUpload'密钥。

  1. 您有什么建议ERROR_INVALID_PARAMETER吗?
  2. 我是否需要在注册表中设置所有错误报告密钥?
  3. 您是否知道在Windows上使用转储的现有应用程序?
  4. 你是否有另一个想法,如何处理卡住的应用程序,而不是在调试模式?
  5. 编辑: 代码中的用法:

    [DllImport("Coredll.dll")]
    private static extern int CaptureDumpFileOnDevice
    ( uint dwProcessId,
      uint dwThreadId,
      string pwzExtraFilesPath);
    
    [DllImport("coredll.dll")]
    private static extern uint GetLastError();
    
    static void Main(string[] args)
    {
        var result = CaptureDumpFileOnDevice(0, 0, null);
        if (result == 0)
        {
            Console.WriteLine("Error! failed to capture dump file for thread id {0} got {1}, {2}",
            threadId, Marshal.GetLastWin32Error(), GetLastError());
        } 
    }
    

1 个答案:

答案 0 :(得分:0)

[DllImport("Coredll.dll")] 
private static extern int CaptureDumpFileOnDevice( uint dwProcessId, uint dwThreadId, string pwzExtraFilesPath);

这看起来非常错误。 尝试:

[DllImport("Coredll.dll")] 
private static extern int CaptureDumpFileOnDevice( unsigned long dwProcessId, unsigned long dwThreadId, InptPtr pwzExtraFilesPath);

如果要传递字符串,请使用

将其转换为C风格的unicode字符串
Marshal.StringToCoTaskMemUni(YourStringHere)

为了通过null - 改为通过IntPtr.Zero