2011-11-21 22 views
5

Tôi có đoạn code mẫu sau trong D:Làm thế nào để hiển thị số dòng trong backtraces D?

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); 
} 

tôi biên soạn mã này với DMD (sử dụng v2.056 trên OS X). Khi tôi chạy nó, nó rõ ràng bị treo:

[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 
---------------- 

Có cách nào để lấy số dòng trong backtrace thay vì vị trí không? Tôi có thể thấy số dòng của vụ tai nạn (5 trong [email protected](5)), nhưng nó chỉ là đầu của backtrace. Tôi có thể lấy số dòng bên trong f()main() không?

Trả lời

3

Do thời gian chạy D không thực hiện đủ phân tích thông tin gỡ lỗi để lấy số dòng, bạn sẽ cần sử dụng trình gỡ lỗi. Nó có thể được mong đợi rằng những gì bạn muốn sẽ được thực hiện tại một số điểm.

Hiện tại, hãy biên dịch chương trình của bạn bằng cờ trình biên dịch -gc, sau đó chạy chương trình qua gdb.

+1

Tại sao bạn cần trình gỡ lỗi? Biên dịch với thông tin gỡ lỗi là đủ. – Trass3r

+1

Vì thời gian chạy không thực hiện trình phân tích cú pháp thông tin gỡ lỗi đến mức có được số dòng? –

+0

Đoán đó là một vấn đề Linux sau đó. Việc thực hiện stacktrace Windows tôi sử dụng được số dòng. – Trass3r

Các vấn đề liên quan