2014-05-12 84 views
1

我有一個C#WPF應用程序,並試圖找出一種方法來使用轉儲文件來確定使用Visual Studio 2010的崩潰位置。我正在使用SysWow64 \ TaskMgr.exe獲得徘徊在500MB左右的崩潰轉儲。查找基於崩潰轉儲的崩潰位置

這是我的啓動代碼,它使用Visual Basic解決方法來確保我只有一個實例正在運行。

using System; 
using Microsoft.VisualBasic.ApplicationServices; 

namespace UselessCrashDump 
{ 
    public class Startup 
    { 
     [STAThread] 
     public static void Main(string[] args) 
     { 
      SingleInstanceManager singleInstanceManager = new SingleInstanceManager(); 
      singleInstanceManager.Run(args); 
     } 
    } 

    // Using VB bits to detect single instances and process accordingly: 
    // * OnStartup is fired when the first instance loads 
    // * OnStartupNextInstance is fired when the application is re-run again  
    public class SingleInstanceManager : WindowsFormsApplicationBase 
    { 
     App _app; 

     public SingleInstanceManager() 
     { 
      this.IsSingleInstance = true; 
     } 

     protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e) 
     { 
      //first launch 
      _app = new App(); 
      _app.InitializeComponent(); 
      _app.Run(); 

      return false; 
     } 

     protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) 
     { 
      //subsequent launches 
      base.OnStartupNextInstance(eventArgs); 
      _app.Activate(); 
     } 
    } 
} 

現在在我的應用程序中,我添加了一段代碼,在按下按鈕後,它會故意使其崩潰。代碼如下所示:

private void _crash_Click(object sender, RoutedEventArgs e) 
{ 
    CrashMe(null);   
} 

private void CrashMe(string someString) 
{ 
    someString.Split(' '); 
} 

果然,在我運行該exe後,單擊按鈕程序崩潰。然後我得到崩潰轉儲,打開它,這是我看到: enter image description here

我期待的代碼在崩潰的特定位置中斷。但相反,故障轉儲指向程序的入口點。這發生在所有崩潰。我希望看到崩潰的確切位置,它在調試會話期間發生的方式。

我在做什麼錯?轉儲文件本身似乎被加載PDB文件,由輸出至少判斷:

'[MyApp].DMP' (Managed): Loaded 'C:\Program Files (x86)\[MyCompany]\[MyApp].exe', Symbols loaded. 

它似乎並沒有被加載本地符號,但是我想因爲它是一個管理應用程序,我不知道需要它們:

'[MyApp].DMP': Loaded 'C:\Program Files (x86)\[MyCompany]\[MyApp].exe', No native symbols in symbol file. 

回答

1

帶有任務管理器的轉儲異常時不是很可靠。請嘗試使用SysInternals ProcDump-e -ma -x "my.exe" "my.dmp",或將Windows錯誤報告配置爲create local dumps(將轉儲類型設置爲2 /滿)。

一旦你有一個很好的轉儲,Visual Studio應該在打開轉儲後在Exception code字段中顯示一些內容。我想你的領域看起來像我的時候是空的(見截圖)。

Screenshot

如果轉儲是好的,它應該有內部的異常代碼:

enter image description here

0

首先你的代碼沒有任何try catch語句。當你的代碼崩潰時,它將異常發送給上層處理程序。在您的代碼中,最新的處理程序是Main void本身,所以這就是您看到該部分的原因。

此外,您不需要本地符號。本機符號是您在此示例中不需要的COM DLL文件。

+0

的主要方法是.NET代碼,沒有異常處理程序。如果異常冒泡,則由操作系統處理。但即使在這種情況下,您也可以看到異常的調用堆棧。如果這不可能,那麼我們如何能夠在沒有try/catch語句的情況下進行調試? –

+0

@ThomasW。我不認爲我說過與你不同的東西。我通過查看他的截圖回答了他的問題。如果你在他的Visual Studio上看到綠色標記,你可以看到異常發生在其他地方,但它在Main方法的末尾冒出了泡泡。另外,我沒有說沒有try/catch語句就看不到異常。 –

+0

Main方法中沒有發生異常。這只是偶然發生的,Main方法中的代碼在執行轉儲時執行。看到我上面的截圖。根本沒有例外。 –

0

找到解決我的問題。實際上有兩個問題:

1)原來使用任務管理器不包含異常信息(此指出這篇文章中所產生轉儲文件:http://blogs.msdn.com/b/debugger/archive/2009/12/30/what-is-a-dump-and-how-do-i-create-one.aspx

2)爲了解決問題1,我嘗試使用procdump應用程序在崩潰後獲取我的轉儲,但那也沒用,並指向Run()中的某處。修復後竟然使用procdump來啓動應用程序,並在崩潰的瞬間寫入崩潰轉儲。這最終解決了問題,並打開crashdump使我直接進入有害的代碼行。我使用的procdump命令是:

procdump -e -ma -x dump.dmp "C:\Program Files(86)\My Company\MyApp.exe" 
+0

差不多同一時間回答。我認爲你應該將參數切換到-x:首先是EXE,然後是DMP。 –

+0

我在線看到幾個文檔中的exe文件,但它不起作用,它只是吐出'usage:'提示符,它表示如下: -x ,所以至少在我的procdump(v6.00)轉儲文件版本中首先進行。 – Eternal21