2011-11-21 35 views
5

我在d以下示例代碼:如何在D backtraces中顯示行號?

import std.stdio; 

int g(int i) { 
    auto l = [1, 2, 3, 4]; 
    return l[i]; 
} 

void f(int i) { 
    writeln(g(i)); 
} 

void main(string[] args) { 
    f(1); 
    f(10); 
    f(2); 
} 

I(使用在OS X v2.056)編譯該代碼與DMD。當我運行它時,它顯然崩潰:

[email protected](5): Range violation 
---------------- 
5 test 0x000b823a _d_array_bounds + 30 
6 test 0x000aa44b D4test7__arrayZ + 27 
7 test 0x000aa4ae int test.g(int) + 94 
8 test 0x000aa4c7 void test.f(int) + 11 
9 test 0x000aa422 _Dmain + 26 
10 test 0x000b87b3 extern (C) int rt.dmain2.main(int, char**).void runMain() + 23 
11 test 0x000b835d extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate()) + 29 
12 test 0x000b8800 extern (C) int rt.dmain2.main(int, char**).void runAll() + 64 
13 test 0x000b835d extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate()) + 29 
14 test 0x000b82f7 main + 179 
15 test 0x000aa3fd start + 53 
16 ???  0x00000001 0x0 + 1 
---------------- 

有沒有辦法在回溯而不是位置獲取行號?我可以看到崩潰的行號(5,[email protected](5)),但它只是回溯的頂部。我可以在f()main()內獲得行號嗎?

回答

3

由於D運行時沒有實現足夠的調試信息解析來獲取行號,所以您將需要使用調試器。可以預計,你想要的東西將在某個時刻實施。

現在,用-gc編譯器標誌編譯您的程序,然後通過gdb運行程序。

+1

爲什麼你需要一個調試器?編譯調試信息應該足夠了。 – Trass3r

+1

由於運行時沒有實現調試信息解析器來獲取行號? –

+0

那麼猜猜這是一個Linux問題。我使用的Windows堆棧跟蹤實現獲取行號。 – Trass3r