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