使用lldb进行调试时,较高的行号无法解析为断点

时间:2016-08-30 06:59:48

标签: c++ clang mips lldb lld

我正在尝试在MIPS32r6程序中设置断点,该程序计算Brainfsck中的Mandelbrot集。程序本身是用C ++编写的,用Clang编译,我正在使用LLDB进行调试。

我遇到的问题是,在LLDB中,我可以设置某些断点,主要是在较低的行号上,没有问题。但是,在Main.cpp中的第70行之后,断点即将出现,因为未解决了这个问题。 (即使执行断点列表显示它们具有完全合理的地址)。也就是说,在#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 个答案:

答案 0 :(得分:1)

我尝试在lldb中执行target modules dump line-table Main.cpp以查看lldb认为线表的样子。然后用类似readelf --debug-dump=decodedline MipsTest.bin的东西来查看二进制文件的DWARF行表(我认为这是正确的 - 我正在查看网络上的readelf主页)。

答案 1 :(得分:1)

使用您的样本二进制文件,我得到:

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

所以我们找到了断点的地址。如果在运行时未解析,则意味着我们无法在该地址处实现断点(例如由于某种原因无法将陷阱写入程序存储器中。)