C++ で記述された他のアプリケーションをテストする C#/VB.NET アプリケーションがあります。C++ アプリケーションが応答しない場合は、そこからコールスタックを取得したいと考えています。C++ で書かれたさまざまな例 (dbghelp.dll CaptureStackBackTraceやWalk the callstackなど) を見つけましたが、C# で書かれたものは何も見つかりませんでした。助けてくれませんか?
2 に答える
0
これが私のチーム メンバーによる VB.NET の実装です。
- ADPlusをダウンロードして、プロジェクトに追加します。ADPlus はDebugging Tools for Windowsに含まれています。
次のコードで呼び出します。
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 に答える