相关疑难解决方法(0)

从另一个线程打印堆栈跟踪

我知道我可以使用backtrace()或[NSThread callStackSymbols]来获取当前线程的堆栈跟踪,但是如何获得DIFFERENT线程的堆栈跟踪(假设它已被冻结)?

iphone objective-c stack-trace

7
推荐指数
2
解决办法
5015
查看次数

如何挂起另一个线程(不是当前线程)?

我正在尝试实现微控制器的仿真.该仿真并不意味着对一个特定微控制器进行时钟周期精确表示,而是检查代码的一般正确性.

我想过有一个执行普通代码的"主线程"和一个执行ISR代码的第二个线程.每当需要运行ISR时,ISR线程就会挂起"主线程".

当然,我想要一个阻止中断的功能.我想用一个互斥体解决这个问题,ISR线程只要执行ISR代码就会保留,而主线程只要"中断被阻塞"就会保存它.

然后可以通过暂停但杀死主线程(以及启动执行POR功能的新线程)来实现POR(上电复位).

Windows API提供了必要的功能.但似乎不可能使用posix线程(在linux上)执行上述操作.

我不想改变实际的硬件独立微控制器代码.因此,插入任何内容以检查挂起的中断都不是一种选择.

在非性能良好的点接收中断是可取的,因为这也发生在微控制器上(除非阻止中断).

有没有办法在Linux上挂起另一个线程?(我认为,调试器必须以某种方式使用该选项.)

拜托,不要告诉我这是一个坏主意.我知道在大多数情况下都是如此.但主代码不使用标准库或锁/互斥量/信号量.

linux multithreading pthreads

5
推荐指数
3
解决办法
7575
查看次数

C ++获得不同线程的回溯

我想了解我的软件中特定线程的状态,它是从另一个线程执行的。具体来说,我想知道它是否卡住了I / O。我正在考虑通过获取backtrace来做到这一点(除非有人有其他想法?),因为我知道应该将其保留在哪个函数上..但我不知道如何获取该特定线程的backtrace,调用SEGFAULT处理程序...但是gdb可以做到(我怀疑他创建了SEGFAULTS ..)

有人可以帮忙吗?任何的想法?

[编辑]所有3个答案都涉及gdb,我知道我可以从gdb做到这一点,我想知道如何从软件中做到这一点(即使以某种方式链接到gdb库也可以解决,但如何?)

c c++ multithreading pthreads backtrace

5
推荐指数
1
解决办法
1172
查看次数

SIGSTOP和SIGCONT等效于线程

对于线程,是否有类似于SIGSTOP和SICONT的东西?我正在使用pthreads.谢谢

编辑:我正在实现线程之间文件访问同步的粗略形式.因此,如果一个文件已经被一个线程打开,而另一个线程想再次打开它,我需要暂停或暂停第二个线程的执行.当第一个线程完成其工作时,它将检查其他线程想要使用它发布的文件并"唤醒"它们.然后第二个线程从那个点恢复执行.我用自己的书保存数据结构.

c linux signals pthreads

4
推荐指数
2
解决办法
3153
查看次数

如何获得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
查看次数