在C或C++编译的各个阶段,我知道生成了一个目标文件(即any_name.o文件).这个.o文件包含什么?我无法打开它,因为它是一个二进制文件.
有人可以帮帮我吗?目标文件的内容主要依赖于我们在Unix上使用的编译器吗?
XCode支持此Build设置的这两个值:
构建设置>构建选项>调试信息格式.
有谁可以解释这些差异?
我有一个简单的项目,我想调试想生成带调试符号的dSYM文件夹.
运行:
clang++ -std=c++14 -stdlib=libc++ -g -o Lazy Lazy.cpp
像我期望的那样创建Lazy.dSYM.
然而:
clang++ -std=c++14 -stdlib=libc++ -g -c Lazy.cpp
clang++ -stdlib=libc++ -g -o Lazy Lazy.o
Run Code Online (Sandbox Code Playgroud)
不创建Lazy.dSYM(似乎符号嵌入在二进制文件中).
遗憾的是,两步构建是我修改后的makefile所做的.如何从两阶段编译和链接构建生成Lazy.dSYM?
我不需要 dSYM目录,只需调试符号,但想了解它的创建时间和原因.
我知道我可以使用backtrace()或[NSThread callStackSymbols]来获取当前线程的堆栈跟踪,但是如何获得DIFFERENT线程的堆栈跟踪(假设它已被冻结)?
在 OSX 上,当您像这样链接来自多个目标文件的二进制文件时
clang++ -g myfile.cpp -o myfile.o
clang++ myfile.o -shared -o myfile.dylib
Run Code Online (Sandbox Code Playgroud)
它将生成一个.debug_info部分(等),myfile.o但其中myfile.dylib仅存储对的引用myfile.o,您必须dsymutil myfile.dylib手动运行。将目标文件中的dsymutil所有部分链接在一起并将它们存储在一个包中。.debug_infomyfile.dylib.dSYM
我的问题是:有没有办法让 Clang 在编译期间真正链接调试信息并将其直接存储在 中myfile.dylib?
或者,如果这是不可能的,是否可以在生成包后将其嵌入.dSYM到包中?.dylib
我在MacOS上使用CMake为我的C++项目生成Makefile.当我构建一个目标(比如说test/AsyncTest)时,我得到了那个目标,加上一个test/AsyncTest.dSYM/包含以下内容的目录:
test/AsyncTest.dSYM/Contents/Resources/DWARF/AsyncTest
test/AsyncTest.dSYM/Contents/Info.plist
Run Code Online (Sandbox Code Playgroud)
我猜这是调试信息(基于".dSYM"和"DWARF"线索),但我还没有找到一个工具让我检查AsyncTest文件.dwarfdump不认识它.
那么,这个文件究竟是什么?有没有一个工具可以用来转储符号信息(假设它是什么)?当我没有要求时,为什么CMake会产生它呢?我可以不生成它(因为生成的文件是huuuuge)?
c++ ×2
dwarf ×2
macos ×2
c ×1
clang ×1
cmake ×1
compilation ×1
debugging ×1
dsym ×1
ios ×1
iphone ×1
objective-c ×1
stack-trace ×1
xcode ×1