Более высокие номера строк не разрешаются как точки останова при отладке с использованием 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 ...
На данный момент я не уверен, что может быть причиной этой проблемы.
2 ответа
Используя ваш пример двоичного файла, я получаю:
(lldb) b s -l 72
Breakpoint 1: where = MipsTest.bin`main + 544 at Main.cpp:72, address = 0x000134a0
Итак, мы нашли адрес для точки останова. Если он не разрешен во время работы, это означает, что мы не смогли реализовать точку останова по этому адресу (например, по какой-то причине не удалось записать ловушку в память программы).
Я бы попробовал сделать target modules dump line-table Main.cpp
в lldb, чтобы увидеть, как lldb думает, как выглядит таблица строк. Затем посмотрите на таблицу строк DWARF двоичного файла с чем-то вроде readelf --debug-dump=decodedline MipsTest.bin
(Я думаю, что это правильно - я смотрю на главную страницу сайта в Интернете).