Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 程序集-无法设置断点lldb_Macos_Assembly_Nasm_X86 64_Lldb - Fatal编程技术网

Macos 程序集-无法设置断点lldb

Macos 程序集-无法设置断点lldb,macos,assembly,nasm,x86-64,lldb,Macos,Assembly,Nasm,X86 64,Lldb,我组装了这些选项nasm-O0-g-f macho64,但当我试图在文件中的行号处设置任何断点时,lldb抱怨“无法将断点解析到任何实际位置” 我已经开始尝试学习OS X的64位汇编,但到目前为止这是一个真正的挑战,似乎没有任何学习资源。您的汇编程序可能没有为您创建的二进制文件发出任何调试信息。您可以通过在.o文件或二进制文件的.dSYM捆绑包(如果有)上运行dwarfdump--debug line来判断 将二进制文件加载到lldb中,并运行反汇编-n function name命令。这将向您

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


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

您的汇编程序可能没有为您创建的二进制文件发出任何调试信息。您可以通过在
.o
文件或二进制文件的
.dSYM
捆绑包(如果有)上运行
dwarfdump--debug line
来判断

将二进制文件加载到lldb中,并运行
反汇编-n function name
命令。这将向您显示程序集-然后您可以使用
断点集-地址设置断点。默认情况下,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) 
%echo'intmain(){}>a.c
%铿锵交流电
%lldb a.out
(lldb)目标创建“a.out”
当前可执行文件设置为“a.out”(x86_64)。
(lldb)disass-n main
a、 out`main:
a、 输出[0x10000FB0]:pushq%rbp
a、 输出[0x10000FB1]:movq%rsp,%rbp
a、 输出[0x100000fb4]:xorl%eax,%eax
a、 输出[0x100000fb6]:popq%rbp
a、 输出[0x10000FB7]:retq
(lldb)br s-a 0x100000fb4
断点1:地址=0x0000000100000fb4
(lldb)r
已启动进程32406:“/private/tmp/a.out”(x86_64)
进程32406已停止
*线程#1:tid=0x145576,0x0000000100000fb4 a.out`main+4,queue='com.apple.main thread',停止原因=断点1.1
帧#0:0x0000000100000fb4 a.out`main+4
a、 out`main:
->0x100000fb4:xorl%eax,%eax
0x100000fb6:popq%rbp
0x100000fb7:retq
0x100000fb8:添加%eax,(%rax)
(lldb)

以前从未这样做过,但您确定源文件已加载到LLDB中吗?您试图如何设置断点?在组装和链接之后,我只运行$lldb foo并设置断点(lldb)断点集--文件foo.asm--第12行