我知道我可以使用backtrace()或[NSThread callStackSymbols]来获取当前线程的堆栈跟踪,但是如何获得DIFFERENT线程的堆栈跟踪(假设它已被冻结)?
我正在尝试实现微控制器的仿真.该仿真并不意味着对一个特定微控制器进行时钟周期精确表示,而是检查代码的一般正确性.
我想过有一个执行普通代码的"主线程"和一个执行ISR代码的第二个线程.每当需要运行ISR时,ISR线程就会挂起"主线程".
当然,我想要一个阻止中断的功能.我想用一个互斥体解决这个问题,ISR线程只要执行ISR代码就会保留,而主线程只要"中断被阻塞"就会保存它.
然后可以通过暂停但杀死主线程(以及启动执行POR功能的新线程)来实现POR(上电复位).
Windows API提供了必要的功能.但似乎不可能使用posix线程(在linux上)执行上述操作.
我不想改变实际的硬件独立微控制器代码.因此,插入任何内容以检查挂起的中断都不是一种选择.
在非性能良好的点接收中断是可取的,因为这也发生在微控制器上(除非阻止中断).
有没有办法在Linux上挂起另一个线程?(我认为,调试器必须以某种方式使用该选项.)
拜托,不要告诉我这是一个坏主意.我知道在大多数情况下都是如此.但主代码不使用标准库或锁/互斥量/信号量.
我想了解我的软件中特定线程的状态,它是从另一个线程执行的。具体来说,我想知道它是否卡住了I / O。我正在考虑通过获取backtrace来做到这一点(除非有人有其他想法?),因为我知道应该将其保留在哪个函数上..但我不知道如何获取该特定线程的backtrace,调用SEGFAULT处理程序...但是gdb可以做到(我怀疑他创建了SEGFAULTS ..)
有人可以帮忙吗?任何的想法?
[编辑]所有3个答案都涉及gdb,我知道我可以从gdb做到这一点,我想知道如何从软件中做到这一点(即使以某种方式链接到gdb库也可以解决,但如何?)
对于线程,是否有类似于SIGSTOP和SICONT的东西?我正在使用pthreads.谢谢
编辑:我正在实现线程之间文件访问同步的粗略形式.因此,如果一个文件已经被一个线程打开,而另一个线程想再次打开它,我需要暂停或暂停第二个线程的执行.当第一个线程完成其工作时,它将检查其他线程想要使用它发布的文件并"唤醒"它们.然后第二个线程从那个点恢复执行.我用自己的书保存数据结构.
在对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) c ×3
pthreads ×3
linux ×2
stack-trace ×2
backtrace ×1
c++ ×1
callstack ×1
ios ×1
iphone ×1
objective-c ×1
signals ×1
stack-frame ×1