Более высокие номера строк не разрешаются как точки останова при отладке с использованием lldb

Я пытаюсь установить точки останова в программе MIPS32r6, которая вычисляет множество Мандельброта в Brainfsck. Сама программа написана на C ++, скомпилирована с Clang, а я отлаживаю с LLDB.

Проблема, с которой я сталкиваюсь, заключается в том, что, находясь в LLDB, я могу устанавливать определенные контрольные точки, в основном на нижних номерах строк, без проблем. Однако после строки № 70 в Main.cpp точки останова становятся «неразрешенными» (даже при выполнении список точек останова показывает их с вполне разумными адресами). То есть все точки останова, которые я пытаюсь установить после строки № 70, становятся нерешенными, и все разумные точки останова перед строкой № 70 разрешаются без проблем

Я поместил копию двоичного файла, который я связал здесь: http://filebin.ca/2tJzo2LLBJWO/MipsTest.bin

И копия Main.cpp здесь: https://paste.ee/p/WYs8Y

Я строю со следующими вариантами:

clang -mcompact-branches=always -fasynchronous-unwind-tables -funwind-tables -fexceptions -fcxx-exceptions -mips32r6 -O0 -g -glldb ...

lld --discard-none -znorelro --eh-frame-hdr ...

На данный момент я не уверен, что может быть причиной этой проблемы.

1

Решение

Я бы попробовал сделать target modules dump line-table Main.cpp в lldb, чтобы увидеть, как lldb думает, как выглядит таблица строк. Затем посмотрите на таблицу строк DWARF двоичного файла с чем-то вроде readelf --debug-dump=decodedline MipsTest.bin (Я думаю, что это правильно — я смотрю на главную страницу сайта в Интернете).

1

Другие решения

Используя ваш пример двоичного файла, я получаю:

(lldb) b s -l 72
Breakpoint 1: where = MipsTest.bin`main + 544 at Main.cpp:72, address = 0x000134a0

Итак, мы нашли адрес для точки останова. Если он не разрешен при запуске, это означает, что мы не смогли реализовать точку останова по этому адресу (например, по какой-то причине не удалось записать ловушку в память программы).

1

По вопросам рекламы [email protected]