Как показать номера строк в D-трассировках? - PullRequest
5 голосов
/ 21 ноября 2011

У меня есть следующий пример кода в 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);
}

Я скомпилировал этот код с DMD (используя v2.056 на OS X). Когда я запускаю его, он явно вылетает:

 core.exception.RangeError@test(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 в core.exception.RangeError@test(5)), но это только вершина следа. Могу ли я получить номера строк внутри f() и main()?

1 Ответ

3 голосов
/ 21 ноября 2011

Поскольку во время выполнения D не реализовано достаточно разбора отладочной информации для получения номеров строк, вам нужно будет использовать отладчик. Можно ожидать, что то, что вы хотите, будет реализовано в какой-то момент.

Пока что скомпилируйте вашу программу с флагом компилятора -gc, затем запустите программу через gdb.

...