【问题标题】:Macbook M1 assembly lldb displays only 3 source lines then switches to object code displayMacbook M1 程序集 lldb 仅显示 3 行源代码然后切换到目标代码显示
【发布时间】:2022-12-04 01:36:25
【问题描述】:

首次尝试 ARM64 (apple M1) 汇编编码。具有可以正确组装和运行的基本“hello world”代码,但是当我在 lldb 中运行它时,只有前三行以完整的源代码格式显示,如下所示:

Abenaki:hello jiml$ ~/llvm/clang+llvm-15.0.2-arm64-apple-darwin21.0/bin/lldb hello
(lldb) target create "hello"
Current executable set to '/Users/jiml/Projects/GitRepos/ARM/hello/hello/hello/hello' (arm64).
(lldb) b main
Breakpoint 1: where = hello`main + 4, address = 0x0000000100003f7c
(lldb) r
Process 5017 launched: '/Users/jiml/Projects/GitRepos/ARM/hello/hello/hello/hello' (arm64)
Process 5017 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100003f7c hello`main at hello.s:19
   16   
   17   _main:
   18       mov     x0, #0x0            // stdout
-> 19       adrp    x1, msg@PAGE        // pointer to string
   20       add     x1, x1, msg@PAGEOFF
   21       ldr     x2, =msg_len        // bytes to output
   22       mov     x16, #0x04          // sys_write
warning: This version of LLDB has no plugin for the language "assembler". Inspection of frame variables will be limited.
(lldb) 

三步之后,显示恢复为裸对象代码,如下所示:

(lldb) s
Process 5017 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step in
    frame #0: 0x0000000100003f88 hello`main + 16
hello`main:
->  0x100003f88 <+16>: mov    x16, #0x4
    0x100003f8c <+20>: svc    #0x80
    0x100003f90 <+24>: adrp   x1, 1
    0x100003f94 <+28>: mov    x2, #0x0

dwarfdump -a 显示所有源代码行都存在于 .o 中; .dSYM 程序集的行为相同。但是,在 lldb 中使用“list”命令可以正确显示所有源代码行。

这是 LLVM(clang、lldb)开发的已知问题吗?任何帮助表示赞赏...

我已经尝试过 LLVM 版本 14 和 15,同样的行为,搜索过类似的问题但没有帮助。

我确实找到了这个 https://stackoverflow.com/questions/73778648/why-is-it-that-assembling-linking-in-one-step-loses-debug-info-for-my-assembly-s 但确实如此不能解决我的问题。

【问题讨论】:

  • 源代码行可能都存在,但它们的范围可能不会涵盖所有主要部分,因为某些代码只是编译器生成但未与特定源代码行相关联,或者因为编译器错误 - 特别是如果您不构建在 - O0。您可以使用source info -f hello.s查看包含所有范围的源映射。您可以使用 image lookup -va &lt;address&gt; 询问 lldb 它对特定地址的了解。这可能会让您深入了解为什么此代码没有关联的源代码行号。
  • 如果这仍然看起来不对,最好向 llvm 错误报告者提交报告:github.com/llvm/llvm-project/issues。请务必包括您的输入 .s 文件和您的编译行以及您正在使用的 clang 和 lldb 的版本。

标签: lldb arm64


【解决方案1】:

所以我想我已经解决了这个问题但不确定它是否是真正的编译器错误。

我用C写了hello world,在lldb中编译确认完整源码显示。然后我用 -S 重新运行 clang 以生成汇编源代码。

然后我组装了那个来源......

clang -g -c -o hello.o hello.s
clang -o hello hello.o -lSystem -arch arm64

并确认它也在 lldb 中运行,并显示完整的源代码。然后我一行一行地移动我手写的代码,以便找出问题发生的地方。似乎我的字符串数据和长度计算有问题。在我最初的数据部分:

msg: ascii "Hello ARM64
"
msg_len = . - msg

来自 Intel 世界,这似乎非常自然;-) 添加长度计算会导致调试数据出现某种损坏。但是,可执行文件有一个正确的 OSO 语句指向 hello.o (nm -ap hello) 并且目标文件还引用了源文件中的所有源语句 (dwarfdump --debug-line hello.o) 但仍然没有t 在第三步之后显示源代码。奇怪的是 lldb 中的“source info -f hello.s”只列出了四行。

我找到了三个解决方法。首先在两个语句之间添加标签似乎允许正确的行为:

msg: ascii "Hello ARM64
"
nothing:
msg_len = . - msg

其次,使用等式:

msg: ascii "Hello ARM64
"
.equ msg_len, . - msg

三、使用两个标签:

msg: ascii "Hello ARM64
"
msg_end:
msg_len = msg_end - msg

将向 llvm 提交报告,看看他们怎么说。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 2011-12-21
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多