1

C++ で記述された他のアプリケーションをテストする C#/VB.NET アプリケーションがあります。C++ アプリケーションが応答しない場合は、そこからコールスタックを取得したいと考えています。C++ で書かれたさまざまな例 (dbghelp.dll CaptureStackBackTraceやWalk the callstackなど) を見つけましたが、C# で書かれたものは何も見つかりませんでした。助けてくれませんか?

4

2 に答える 2

0

これが私のチーム メンバーによる VB.NET の実装です。

  1. ADPlusをダウンロードして、プロジェクトに追加します。ADPlus はDebugging Tools for Windowsに含まれています。
  2. 次のコードで呼び出します。

    Public Shared Sub DumpCallStack(processID As Integer, outputFolder As String)
    
        Const serverSymbolPath As String = "http://msdl.microsoft.com/download/symbols"
        Const localSymbolFolder As String = "c:\temp\localSymbols"
        Dim symbolFolderPath As String = String.Format("SRV*{0}* {1}", serverSymbolPath, localSymbolFolder)
    
        Directory.CreateDirectory(localSymbolFolder)
        Directory.CreateDirectory(outputFolder)
    
        Dim arguments As String = String.Format("/c Cscript //nologo ""{0}"" -quiet -quick -NoTlist -p {1} -dbg ""{2}"" -yp ""{3}"" -o ""{4}""",
                                "c:\Adplus\x64\adplus.vbs",
                                processID,
                                "CDB.exe",
                                symbolFolderPath,
                                outputFolder)
    
        Dim pro As Process = New Process()
        pro.StartInfo.FileName = "cmd.exe"
        pro.StartInfo.Arguments = arguments
        pro.StartInfo.UseShellExecute = False
        pro.StartInfo.EnvironmentVariables("_NT_SYMBOL_PATH") = symbolFolderPath
    
        pro.Start()
    
        'wait up to 1 minute for the cmd.exe to exit
        pro.WaitForExit(60000)
    
        'Wait up to 1 minute for the windgb.exe to exit
        WaitForProcessExit("cdb", 60000)
    End Sub
    
    Private Shared Sub WaitForProcessExit(processName As String, milliseconds As Integer)
        Dim pros As Process() = Process.GetProcessesByName(processName)
        If pros Is Nothing Then Return
    
        For Each pro As Process In pros
            pro.WaitForExit(milliseconds)
        Next
    End Sub
    

この呼び出しは、いくつかのファイルを含むディレクトリを作成します。それらの 1 つには、ターゲット アプリケーションからのコールスタックが含まれています。

于 2014-04-16T09:42:58.633 に答える