汇编 - 无法设置断点lldb

4
我使用以下选项进行组装:nasm -O0 -g -f macho64,但是当我尝试在文件的行号处设置任何断点时,lldb会出现“无法将断点解析到任何实际位置”的错误提示。
我已开始学习在OS X上的64位汇编语言,但目前为止证明这是一个真正的挑战。似乎几乎没有学习资源可用。

你以前从未做过这个,但你确定源文件已经加载到LLDB了吗?你是如何尝试设置断点的? - Alexander O'Mara
组装和链接后,我只需运行 $ lldb foo 并设置断点 (lldb) breakpoint set --file foo.asm --line 12。 - zMesh
1个回答

5
您的汇编程序可能没有为您创建的二进制文件生成任何调试信息。 您可以通过在.o文件或二进制文件的.dSYM包上运行dwarfdump --debug-line来判断。
将二进制文件加载到lldb中,并运行disassemble -n function-name命令,即可查看汇编代码 - 然后可以使用breakpoint set -a address设置断点。 默认情况下,lldb会关闭地址空间随机化(ASLR)并运行您的二进制文件 - 因此,二进制文件每次都会在相同的地址运行,而不是在随机化的地址加载您的程序。
以下是一个简单的示例:
%  echo 'int main () { }' > a.c
% clang a.c
% lldb a.out
(lldb) target create "a.out"
Current executable set to 'a.out' (x86_64).
(lldb) disass -n main
a.out`main:
a.out[0x100000fb0] <+0>: pushq  %rbp
a.out[0x100000fb1] <+1>: movq   %rsp, %rbp
a.out[0x100000fb4] <+4>: xorl   %eax, %eax
a.out[0x100000fb6] <+6>: popq   %rbp
a.out[0x100000fb7] <+7>: retq   

(lldb) br s -a 0x100000fb4
Breakpoint 1: address = 0x0000000100000fb4
(lldb) r
Process 32406 launched: '/private/tmp/a.out' (x86_64)
Process 32406 stopped
* thread #1: tid = 0x145576, 0x0000000100000fb4 a.out`main + 4, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000fb4 a.out`main + 4
a.out`main:
->  0x100000fb4 <+4>: xorl   %eax, %eax
    0x100000fb6 <+6>: popq   %rbp
    0x100000fb7 <+7>: retq   
    0x100000fb8:      addl   %eax, (%rax)
(lldb) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接