簡體   English   中英

如何在堆棧跟蹤轉儲中獲取變量值?

[英]How do I get variable values in my stack trace dump?

我維護一個應用程序,當應用程序發生錯誤時,它會向我發送 email。 我將堆棧跟蹤轉儲到 email 中,它似乎工作正常。 唯一缺少的是變量的 我接到所有的電話等等,從來沒有任何變量。 為了將這些變量值也轉儲到 email 中,我還缺少什么?

下面是我用來將其轉儲到 email 的代碼:

UtilityClass.SendEmail(shortNTID,
                       "admin@mydomain.com",
                       new string[] { "support@mydomain.com" },
                       "MyApplication error has occured for user: " +
                            shortNTID + " (Main).",
                       "Message: " + ex.Message.ToString() +
                       " Source: " + ex.Source.ToString() +
                       " Target Site: " + ex.TargetSite.ToString() +
                       " Stack Trace: " + ex.StackTrace.ToString());

這是 email 中的結果:

消息:指定的強制轉換無效。 來源:MyApplication 目標站點:Void FindFormAndActivate(MyApplication.MDIParentForm, System.String, System.Object) 堆棧跟蹤:在 MyApplication.DashboardAlerts.NavigateToAssignment() 在 MyApplication.UtilityClass.FindFormAndActivate(MDIParentForm frmMDIParentForm, String formName, Object 參數) .DashboardAlerts.utAlerts_MouseClick(Object sender, MouseEventArgs e) at System.Windows.Forms.Control.OnMouseClick(MouseEventArgs e) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows. Forms.Control.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms .Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

編輯

一些答案建議我自己將變量值添加到 email 中。 我將如何獲得這些值? 發送 email 的這段代碼不在失敗的方法中。 這是在發生異常時運行的代碼。 如果異常沒有得到處理和糾正,我讓它冒泡到線程的頂部,例如Application.ThreadException += new ThreadExceptionEventHandler(HandleError); HandleError方法是進行此 email 調用的方法。 它不知道導致異常的方法的變量或參數是什么。

StackTrace屬性只是發生異常時的調用圖。 如果您對任意局部變量的 state 感興趣,您必須自己在異常處理程序中將它們添加到 email 中。

更新:如果你想通過一系列異常來傳遞變量值,當你在適當的 scope 中捕獲它時,你必須將它們插入到異常中(即在消息中)。

與其嘗試將它們放在堆棧跟蹤中,不如將它們添加到您發送的字符串中。

UtilityClass.SendEmail(shortNTID,
                   "admin@mydomain.com",
                   new string[] { "support@mydomain.com" },
                   "MyApplication error has occured for user: " +
                        shortNTID + " (Main).",
                   "Message: " + ex.Message.ToString() +
                   " Source: " + ex.Source.ToString() +
                   " Target Site: " + ex.TargetSite.ToString() +
                   " Stack Trace: " + ex.StackTrace.ToString() +
                   " MyVar1 Value: " + MyVar1.ToString() +
                   " MyVar2 Value: " + MyVar2.ToString() +
                   " MyVar3 Value: " + MyVar3.ToString());

編輯:

由於 email 是在變量 scope 之外發送的,因此當它們在 scope 中時,您需要收集它們並將它們添加到拋出的異常中。 恐怕我對ThreadException object 了解不多,但我會創建一個自定義異常來保存這些變量的值。 您將無法自動將它們添加到堆棧跟蹤中; 那不是它的真正用途。 所以,在我的腦海中:

public class CustomException : Exception
{
    public string MyVar1 { get; private set; }
    public string MyVar2 { get; private set; }
    public Exception OriginalException { get; private set; }

    public CustomException(Exception original, string myVar1, string myVar2)
    {
        MyVar1 = myVar1;
        MyVar2 = myVar2;
        OriginalException = original;
    }
}

稍后,深入您的代碼:

try
{
    //code that might throw exceptions
}
catch (Exception e)
{
    throw new CustomException(e, myVar1, myVar2);
}

通過將原始異常保留在OriginalException屬性中來保留原始異常這一事實應該(希望)也保留原始堆棧跟蹤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM