正如您所知,当我们在Xcode中运行Swift项目时出现问题时,我们将直接进入调试导航器的线程部分,并且我们将面临这样的一些汇编代码:
我想知道是否有任何参考,教程或工具来理解这些代码,应该有我们直接针对这些代码的理由
让我清楚;我知道如何解决错误,但是当我不了解这样的事情时,这会让我受苦。我想知道这些代码是什么,以及我们如何使用它们或至少理解它们。
谢谢:)
答案 0 :(得分:1)
原始问题:那是什么语言?这是x86-64的AT&T语法汇编语言。 https://stackoverflow.com/tags/x86/info用于获取来自Intel和其他资源的手册,https://stackoverflow.com/tags/att/info用于了解AT&T语法与大多数手册中使用的Intel语法有何不同。 (我认为x86标签Wiki上有一些AT&T语法教程。)大多数AT&T语法反汇编程序也具有intel语法模式,因此,如果您想要与Intel手册相匹配的asm,可以使用它。
有什么意义?
重点是,如果您知道asm,则可以调试程序。或者,您也可以向了解它的人显示该asm,或将其包含在错误报告中。
您编译时没有调试符号吗?还是在没有符号的库代码中崩溃?如果调试器无法显示源代码或您要求使用asm,调试器通常会向您显示asm。
如果您自己的代码具有调试符号,则至少可以追溯到确实具有源代码的父函数中。 (除非堆栈已损坏。)
您的程序错误是否以粉红色突出显示?这有点奇怪,因为它是从静态数据加载的(相对RIP的加载意味着地址是链接时间常数)。
您可能是munmap
或mprotect
程序数据或文本段的那一页,所以加载会出错吗?通常,只有在寻址模式涉及指针时,您才会出错。
({call *0x1234(%rip)
就在通过函数指针进行调用之前。函数指针存储在内存中,但是执行call
之后的代码获取会指向错误。未映射或不可执行的页面)。但是您的第一张图片显示您得到的是SIGABRT,而不是SIGSEGV,因此更像是在断言失败后有意中止了程序。
我相信大多数快速编码人员都不知道asm
没有调试符号和源文件,调试器所能做的没有什么比这有用的了。
还要记住,大多数调试器作者确实知道asm,因此对他们来说,这是一个明显有用的功能/行为。他们知道许多人将无法从中受益,但是有些人会受益。
Asm是计算机上真正运行的东西。没有asm,您将找不到错误代码的编译器错误等。就软件错误而言,没有比asm低的级别了,因此,您不能随意选择更低级别的层。>
(除非您的反汇编程序或调试器中还存在错误,在这种情况下,您需要检查十六进制机器代码。)