最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中獲取并顯示錯(cuò)誤行號(hào)的三種方式

 更新時(shí)間:2026年05月26日 08:47:57   作者:吳可可123  
在 C# 開發(fā)中,獲取并顯示錯(cuò)誤的行號(hào)是調(diào)試和異常處理的關(guān)鍵環(huán)節(jié),這通常涉及在調(diào)試時(shí)查看 IDE 中的堆棧信息,以及在運(yùn)行時(shí)通過代碼捕獲并記錄包含行號(hào)的異常信息,因此本文給大家介紹了在C#中獲取并顯示錯(cuò)誤行號(hào)的三種方式,需要的朋友可以參考下

引言

在 C# 開發(fā)中,獲取并顯示錯(cuò)誤的行號(hào)是調(diào)試和異常處理的關(guān)鍵環(huán)節(jié)。這通常涉及在調(diào)試時(shí)查看 IDE 中的堆棧信息,以及在運(yùn)行時(shí)通過代碼捕獲并記錄包含行號(hào)的異常信息。核心機(jī)制依賴于程序數(shù)據(jù)庫文件(.pdb)和 System.Diagnostics 命名空間下的類。

1. 在開發(fā)環(huán)境(IDE)中顯示行號(hào)

在 Visual Studio 等 IDE 中,錯(cuò)誤行號(hào)默認(rèn)會(huì)在錯(cuò)誤列表、輸出窗口異常助手中顯示。

顯示位置說明
錯(cuò)誤列表 (Error List)編譯錯(cuò)誤和警告會(huì)直接顯示文件名和行號(hào)。
輸出窗口 (Output Window)程序運(yùn)行時(shí),未處理的異常堆棧跟蹤會(huì)在此輸出,其中包含完整的文件名、方法名和行號(hào)信息。
異常助手 (Exception Helper)調(diào)試時(shí)發(fā)生異常,彈出的異常助手對(duì)話框會(huì)高亮導(dǎo)致異常的代碼行。

確保行號(hào)顯示設(shè)置已開啟:
在 Visual Studio 中,需確保代碼編輯器已啟用行號(hào)顯示。

  1. 點(diǎn)擊菜單欄的 工具 (Tools) -> 選項(xiàng) (Options)
  2. 在左側(cè)樹形菜單中,展開 文本編輯器 (Text Editor) -> C#(或 所有語言)。
  3. 在右側(cè)勾選 行號(hào) (Line numbers) 選項(xiàng) 。

2. 在運(yùn)行時(shí)通過代碼獲取錯(cuò)誤行號(hào)

為了在日志文件或用戶界面中記錄錯(cuò)誤發(fā)生的具體位置,需要在代碼中主動(dòng)捕獲異常并提取行號(hào)信息。這主要使用 System.Diagnostics.StackTraceSystem.Diagnostics.StackFrame 類。

核心方法:使用 StackTraceStackFrame

以下是一個(gè)獲取并記錄當(dāng)前調(diào)用點(diǎn)文件名和行號(hào)的實(shí)用方法:

using System;
using System.Diagnostics;

public static class ErrorLogger
{
    /// <summary>
    /// 獲取當(dāng)前調(diào)用點(diǎn)的文件名和行號(hào)。
    /// </summary>
    /// <returns>格式為“文件名:行號(hào)”的字符串。</returns>
    public static string GetCurrentFileLine()
    {
        // 創(chuàng)建一個(gè) StackTrace 對(duì)象,參數(shù) `true` 表示需要捕獲文件信息(如文件名、行號(hào))。
        // 注意:在 Release 模式下且無 .pdb 文件時(shí),此信息可能無法獲取。
        StackTrace st = new StackTrace(true);
        // 獲取上一個(gè)堆棧幀(即調(diào)用此方法的位置)。
        // 參數(shù) 1 表示向上回溯一幀??筛鶕?jù)需要調(diào)整。
        StackFrame sf = st.GetFrame(1);
        
        // 從 StackFrame 中提取信息
        string fileName = sf.GetFileName(); // 獲取文件名
        int lineNumber = sf.GetFileLineNumber(); // 獲取行號(hào)
        
        // 如果獲取不到文件名,則用“未知文件”代替
        return $"{fileName ?? "Unknown File"}:{lineNumber}";
    }

    /// <summary>
    /// 記錄異常信息,包含發(fā)生異常的文件和行號(hào)。
    /// </summary>
    /// <param name="ex">捕獲的異常對(duì)象。</param>
    public static void LogException(Exception ex)
    {
        // 獲取異常的堆棧跟蹤
        StackTrace st = new StackTrace(ex, true);
        // 獲取異常發(fā)生點(diǎn)的第一個(gè)堆棧幀(通常是異常拋出的位置)
        StackFrame? frame = st.GetFrame(0);
        
        string errorLocation = "Location information not available.";
        if (frame != null)
        {
            string fileName = frame.GetFileName();
            int lineNumber = frame.GetFileLineNumber();
            string methodName = frame.GetMethod()?.Name;
            errorLocation = $"Error occurred in {methodName} at {fileName}:{lineNumber}";
        }
        
        // 組合并記錄完整的錯(cuò)誤信息
        string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {errorLocation}{Environment.NewLine}" +
                            $"Exception Type: {ex.GetType().FullName}{Environment.NewLine}" +
                            $"Message: {ex.Message}{Environment.NewLine}" +
                            $"Stack Trace: {ex.StackTrace}{Environment.NewLine}";
        
        // 此處可以替換為寫入文件、數(shù)據(jù)庫或發(fā)送到日志服務(wù)的實(shí)際邏輯
        Console.WriteLine(logMessage);
        // File.AppendAllText("error.log", logMessage);
    }
}

// 使用示例
class Program
{
    static void Main()
    {
        try
        {
            SomeProblematicMethod();
        }
        catch (Exception ex)
        {
            // 使用自定義的日志方法記錄異常,其中包含行號(hào)
            ErrorLogger.LogException(ex);
        }
        
        // 演示獲取當(dāng)前行號(hào)
        Console.WriteLine($"當(dāng)前代碼位置: {ErrorLogger.GetCurrentFileLine()}");
    }

    static void SomeProblematicMethod()
    {
        // 模擬一個(gè)會(huì)拋出異常的操作
        throw new InvalidOperationException("This is a simulated error for demonstration.");
    }
}

關(guān)鍵點(diǎn)說明:

  • new StackTrace(true):構(gòu)造函數(shù)中的 true 參數(shù)至關(guān)重要,它指示 StackTrace 收集文件信息(包括行號(hào))。如果為 false 或默認(rèn),則無法獲取這些信息 。
  • .pdb 文件的重要性**:GetFileName()GetFileLineNumber()` 方法能否返回有效信息,強(qiáng)烈依賴于程序數(shù)據(jù)庫文件(.pdb)的存在。該文件在 Debug 模式下默認(rèn)生成,包含了源代碼文件路徑和行號(hào)等調(diào)試信息 。
  • Release 模式下的行號(hào):若要在 Release 部署版本中也能獲取行號(hào),必須在發(fā)布時(shí)包含 .pdb 文件(或使用“調(diào)試”配置發(fā)布)。否則,這些方法可能返回 0 或空值 。

3. 在 Release 模式下獲取行號(hào)的配置

為了確保生產(chǎn)環(huán)境的錯(cuò)誤日志也包含行號(hào),需要對(duì)項(xiàng)目生成和發(fā)布進(jìn)行配置。

方法一:在項(xiàng)目文件中配置始終生成調(diào)試信息

對(duì)于 SDK 風(fēng)格的項(xiàng)目文件(.csproj),可以添加以下配置:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <!-- 關(guān)鍵配置:即使在 Release 模式下也生成完整的調(diào)試信息 -->
    <DebugType>embedded</DebugType> <!-- 或使用 portable、full -->
    <DebugSymbols>true</DebugSymbols>
    <!-- 可選:優(yōu)化代碼,但保留調(diào)試信息(可能會(huì)影響行號(hào)準(zhǔn)確性,但通??捎茫?-->
    <Optimize>true</Optimize>
  </PropertyGroup>
</Project>
  • <DebugType>embedded</DebugType>:將調(diào)試符號(hào)(.pdb 信息)嵌入到主程序集(.dll/.exe)中,便于分發(fā) 。
  • <DebugSymbols>true</DebugSymbols>:明確要求生成調(diào)試符號(hào)。

方法二:在 Visual Studio 發(fā)布設(shè)置中配置

  1. 右鍵點(diǎn)擊項(xiàng)目,選擇 發(fā)布 (Publish)。
  2. 在發(fā)布配置文件中,找到 配置 (Configuration) 設(shè)置。
  3. 展開 文件發(fā)布選項(xiàng) (File Publish Options),勾選 啟用 ReadyToRun 編譯 (Enable ReadyToRun compilation) 下方的 在發(fā)布中包含調(diào)試符號(hào) (Include debug symbols in publish) 或類似的選項(xiàng)(不同 VS 版本措辭可能不同)。

4. 處理特定場景:Unity 與 Bugly 等第三方服務(wù)

在 Unity 引擎中,尤其是在使用 IL2CPP 后端打包 Release 版本時(shí),默認(rèn)不會(huì)生成可用于 C# 堆棧的行號(hào)信息。這會(huì)導(dǎo)致接入 Bugly 等錯(cuò)誤上報(bào)服務(wù)時(shí),堆棧信息中缺少行號(hào) 。

解決方案:

  1. 使用 Development Build + Mono 腳本后端:這是獲取行號(hào)最簡單的方式,但僅適用于開發(fā)和測試,因?yàn)?Mono 后端通常不用于性能要求高的最終發(fā)布 。
  2. 在 IL2CPP 構(gòu)建中啟用調(diào)試:在 Unity 2020 及以上版本,可以在 Player Settings 中,為 IL2CPP 構(gòu)建啟用 Create symbols 選項(xiàng),并確保打包時(shí)包含了對(duì)應(yīng)的 .pdb 文件(在 Unity 中通常是 .pdb.dbg 文件),然后將其與應(yīng)用程序一同上傳到 Bugly 等平臺(tái),平臺(tái)才能解析出行號(hào) 。
  3. 使用 System.Environment.StackTrace:在代碼中,除了捕獲 ExceptionStackTrace 屬性,也可以直接使用 System.Environment.StackTrace 獲取當(dāng)前調(diào)用堆棧,但同樣受 .pdb 文件影響。

總結(jié)與最佳實(shí)踐

場景推薦方法注意事項(xiàng)
開發(fā)調(diào)試依賴 IDE(如 VS)的錯(cuò)誤列表、輸出窗口和異常助手。確保編輯器設(shè)置中已顯示行號(hào) 。
記錄運(yùn)行時(shí)錯(cuò)誤日志catch 塊中使用 new StackTrace(ex, true)StackFrame 提取行號(hào)。必須確保應(yīng)用程序附帶了 .pdb 文件,無論是在 Debug 還是 Release 模式下 。
生產(chǎn)環(huán)境部署發(fā)布時(shí)包含 .pdb 文件(可嵌入程序集),或在構(gòu)建配置中明確設(shè)置生成調(diào)試符號(hào)。權(quán)衡安全性與可調(diào)試性。可將 .pdb 文件單獨(dú)保管,用于錯(cuò)誤分析。
Unity 等特定平臺(tái)檢查 Player Settings,確保為 IL2CPP 等后端啟用了符號(hào)生成,并將符號(hào)文件上傳至錯(cuò)誤分析平臺(tái)。Unity 不同版本和打包方式對(duì)行號(hào)支持差異較大,需查閱對(duì)應(yīng)版本的官方文檔 。

因此,要在 C# 中可靠地顯示錯(cuò)誤行號(hào),代碼層面的正確寫法(使用 StackTrace)和構(gòu)建部署層面的正確配置(確保 .pdb 文件存在)二者缺一不可。

以上就是C#中獲取并顯示錯(cuò)誤行號(hào)的三種方式的詳細(xì)內(nèi)容,更多關(guān)于C#獲取并顯示錯(cuò)誤行號(hào)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

桂平市| 綦江县| 尖扎县| 南部县| 剑川县| 高州市| 南通市| 西乌珠穆沁旗| 精河县| 张家口市| 来宾市| 长宁区| 米脂县| 湖州市| 南城县| 革吉县| 井陉县| 金塔县| 紫阳县| 仁布县| 竹溪县| 盘锦市| 包头市| 遵义市| 三亚市| 甘南县| 福清市| 略阳县| 横山县| 巩留县| 濮阳市| 孙吴县| 新乐市| 邹城市| 格尔木市| 安岳县| 宝山区| 巫溪县| 上高县| 双柏县| 商都县|