xcode - 当我们在 swift 项目中遇到运行时错误时,为什么 Xcode 将我们发送到汇编语言的 Thread 输出?重点是什么 ?

标签 xcode assembly compiler-errors runtime-error

正如你所知,当我们在 Xcode 中运行 Swift 项目时出现问题时,我们将直接进入调试导航器的线程部分,我们将面临一些像这样的汇编代码:

enter image description here

enter image description here

我想知道是否有任何引用、教程或工具来理解这些代码,应该有理由我们直接访问这些代码

让我澄清一下;我知道如何修复这些错误,但是当我不理解这样的事情时,这会让我很痛苦。我想知道这些代码是什么以及我们如何使用它们或至少理解它们。

谢谢:)

最佳答案

原始问题:那是什么语言?这是 x86-64 的 AT&T 语法汇编语言。 https://stackoverflow.com/tags/x86/info来自英特尔和其他资源的手册,以及 https://stackoverflow.com/tags/att/info了解 AT&T 语法与大多数手册中使用的 Intel 语法有何不同。 (我认为 x86 标签 wiki 有一些 AT&T 语法教程。)大多数 AT&T 语法反汇编程序也有 intel 语法模式,因此如果您想要与 Intel 手册相匹配的 asm,则可以使用该模式。


What's the point?

重点是,如果您了解 asm,则可以调试程序。或者,您可以将汇编程序展示给理解它的人,或者将其包含在错误报告中。

您是否在没有调试符号的情况下进行编译?或者它在没有符号的库代码中崩溃了吗?如果调试器无法向您显示源代码,或者您要求提供 asm,那么调试器向您显示 asm 是正常的。

如果您有自己代码的调试符号,您至少可以回溯到您有源代码的父函数。 (除非堆栈已损坏。)


您的程序是否因粉红色突出显示的指令而出错?这有点奇怪,因为它是从静态数据加载的(RIP 相对加载意味着地址是链接时间常量)。

您是否可能 munmapmprotect 程序数据或文本段的该页面,因此加载会出错?通常,只有当寻址模式涉及指针时,才会出现错误。

(不过,在通过函数指针调用之前调用*0x1234(%rip)。函数指针存储在内存中,但在调用之后提取代码如果它指向未映射或不可执行的页面, 执行将会出错)。但你的第一张图片显示你得到了 SIGABRT,而不是 SIGSEGV,所以这更像是断言失败后故意中止的程序。

I believe majority of swift coders don't know asm

如果没有调试符号和源文件,调试器就没有什么更有用的了。

还请记住,大多数调试器作者确实了解 asm,因此对他们来说,这是一个明显有用的功能/行为。他们知道很多人无法从中受益,但有些人会。

Asm 是机器上真正运行的。没有asm,你就找不到错误代码的编译器错误等等。就软件错误而言,没有比asm更低的级别,所以它不是任意选择某些较低级别的层。

(除非您的反汇编器或调试器中也存在错误,在这种情况下您需要检查十六进制机器代码。)

关于xcode - 当我们在 swift 项目中遇到运行时错误时,为什么 Xcode 将我们发送到汇编语言的 Thread 输出?重点是什么 ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52154349/

相关文章:

linux - ARM:禁用 MMU 并更新 PC

java - 无法建立Cordova Phonegap项目Android

c++ - GCC在被杀死时创建带有随机后缀的目标文件

ios - 无法从 XCTest 访问应用程序代码

swift - 错误域=NSURLErrorDomain 代码=-1004

ios - 自定义框架无法在 iOS 模拟器中加载(错误的架构)

ios - 当 xcode 在设备上构建和部署时

c++ - MSVC11 错误中的 x64 位 asm

c - 我是否将非常短的 C 代码正确地翻译成了汇编程序?

c# - 使用 MSBuildWorkspace 从 C# 解决方案中获取错误列表的最快方法是什么?