在Linux中,要获得回溯,您可以使用backtrace()库调用,但它只返回当前线程的回溯.有没有办法得到一些其他线程的回溯,假设我知道它的TID(或pthread_t),我可以保证它睡觉?
似乎libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助.问题是CentOS不支持它,所以我不想使用它.
还有其他想法吗?谢谢.
Apple GCC在哪里/如何将DWARF存储在可执行文件中?
我编译了一个二进制文件gcc -gdwarf-2(Apples GCC).但是,既没有objdump -g也objdump -h没有向我显示任何调试信息.
libbfd也找不到任何调试信息.(我在binutils-mailinglist上问过这个问题.)
然而,我能够通过dsymutil(进入dSYM)提取调试信息.libbfd也可以读取那些调试信息.
在对iPhone 5S设备/ Xcode的7运行的演示应用,我试过让frame pointer一个的任意线程使用thread_get_state,但总是导致不正确的一项:
- (BOOL)fillThreadState:(thread_t)thread intoMachineContext:(_STRUCT_MCONTEXT *)machineContext {
mach_msg_type_number_t state_count = MACHINE_THREAD_STATE_COUNT;
kern_return_t kr = thread_get_state(thread, MACHINE_THREAD_STATE, (thread_state_t)&machineContext->__ss, &state_count);
if (kr != KERN_SUCCESS) {
char *str = mach_error_string(kr);
printf("%s\n", str);
return NO;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我阅读了这样的帧指针:uintptr_t fp = machineContext.__ss.__fp;根据Apple Doc(ARMv6和ARM64),
寄存器R7用作ARMv6上的帧指针
而x64在ARM64上
帧指针寄存器(x29)必须始终寻址有效的帧记录,尽管某些功能(例如叶函数或尾部调用)可能选择不在此列表中创建条目。结果,即使没有调试信息,堆栈跟踪也将始终有意义。
_STRUCT_ARM_THREAD_STATE64
{
__uint64_t __x[29]; /* General purpose registers x0-x28 */
__uint64_t __fp; /* Frame pointer x29 */
__uint64_t __lr; /* Link register …Run Code Online (Sandbox Code Playgroud)