相关疑难解决方法(0)

获得其他线程的回溯

在Linux中,要获得回溯,您可以使用backtrace()库调用,但它只返回当前线程的回溯.有没有办法得到一些其他线程的回溯,假设我知道它的TID(或pthread_t),我可以保证它睡觉?

似乎libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助.问题是CentOS不支持它,所以我不想使用它.

还有其他想法吗?谢谢.

linux multithreading backtrace

17
推荐指数
2
解决办法
1万
查看次数

Apples GCC在哪里/如何将DWARF存储在可执行文件中

Apple GCC在哪里/如何将DWARF存储在可执行文件中?

我编译了一个二进制文件gcc -gdwarf-2(Apples GCC).但是,既没有objdump -gobjdump -h没有向我显示任何调试信息.

libbfd也找不到任何调试信息.(我在binutils-mailinglist上问过这个问题.)

然而,我能够通过dsymutil(进入dSYM)提取调试信息.libbfd也可以读取那些调试信息.

macos gcc objdump dwarf dsymutil

11
推荐指数
1
解决办法
5462
查看次数

如何获得iOS中任意线程的正确帧指针?

获取框架指针的方法

在此处输入图片说明

在对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(ARMv6ARM64),

寄存器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)

c callstack stack-trace stack-frame ios

3
推荐指数
1
解决办法
939
查看次数