【问题标题】:Assembly - Unable to set breakpoints lldb程序集 - 无法设置断点 lldb
【发布时间】:2016-08-16 16:25:52
【问题描述】:

我组装了这些选项nasm -O0 -g -f macho64,但 lldb 抱怨“无法将断点解析到任何实际位置”。当我尝试在文件的行号处设置任何断点时。

我已经开始尝试为 OS X 学习 64 位汇编,但到目前为止,这证明是一个真正的挑战,似乎几乎没有任何学习资源。

【问题讨论】:

  • 以前从未这样做过,但是您确定源文件已加载到 LLDB 中吗?你是如何设置断点的?
  • 组装和链接后,我只需运行 $ lldb foo 并设置断点 (lldb) breakpoint set --file foo.asm --line 12

标签: macos assembly nasm x86-64 lldb


【解决方案1】:

您的汇编程序可能没有为您创建的二进制文件发出任何调试信息。您可以通过在您的 .o 文件上运行 dwarfdump --debug-line 或在您的二进制文件的 .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) 

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 2019-12-18
    • 2018-01-09
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多