首頁 > 軟體

體驗CoreCLR的stack unwinding特性在Linux/Mac上的初步實現

2020-06-16 18:01:42

有了stack unwinding特性,才能在.NET程式中獲取呼叫堆疊(call stack)資訊,才能在異常時顯示呼叫堆疊資訊。這個特性之前只在Windows上有實現,Linux/Mac上的實現最近才剛剛新增,用的是libunwind,詳見Merge branch 'unix_issue177'

如果你不了解stack unwinding,推薦閱讀 C++ Tutorial: Exceptions - Stack Unwinding

下面我們來一起體驗一下。

所使用的範例控制台程式如下:

using System;
class Program
{
    static void A()
    {
        B();
    }

    static void B()
    {
        C();
    }

    static void C()
    {
        D();
    }

    static void D()
    {
        Console.WriteLine(System.Environment.StackTrace);
    }

    static void Main(string[] args)
    {
        A();
    }
}

對應的程式碼檔案名為StackTrace.cs,編譯為StackTrace.exe。

我們先在Visual Studio中建立同樣的控制台程式體驗一下stack unwinding的效果:

at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at Program.D()
at Program.C()
at Program.B()
at Program.A()
at Program.Main(String[] args)

接著看一下沒有實現stack unwinding時的效果。

在Linux上執行corerun StackTrace.exe,控制台無任何輸出。

# runtime_linux/corerun app/StackTrace.exe
# 

在Mac上執行corerun StackTrace.exe出錯:

sh-3.2$ runtime_mac/corerun app/StackTrace.exe
Assert failure (unable to format)
/Users/dudu/git/dotnet/coreclr/src/vm/stackwalktypes.h
SPOffset >= pUnwindInfo->RSPOffsetFromUnwindInfo
**** MessageBox invoked, title 'Assert failure (unable to format)' ****
  SPOffset >= pUnwindInfo->RSPOffsetFromUnwindInfo
********

Assert failure (unable to format)
/Users/dudu/git/dotnet/coreclr/src/vm/stackwalktypes.h
FitsIn(pUnwindInfo->RBPOffset + (SPOffset - pUnwindInfo->RSPOffsetFromUnwindInfo))
**** MessageBox invoked, title 'Assert failure (unable to format)' ****
  FitsIn(pUnwindInfo->RBPOffset + (SPOffset - pUnwindInfo->RSPOffsetFromUnwindInfo))
********

然後看一下stack unwinding初步實現之後的效果。 

在Mac與Linux上執行corerun StackTrace.exe的結果如下:

at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at Program.Main(String[] args)

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-04/116596.htm


IT145.com E-mail:sddin#qq.com