我已经做了很多次google来在信号处理程序中找到backtrace()的正确解决方案,并尝试了几乎所有方法,但是我无法在我的信号处理程序中成功获取backtrace-这不是SIGUSR1处理程序。
但是,我无法从信号处理程序获得完整的回溯。仅打印我在信号处理程序中调用的函数地址。
如果我使用target-gdb二进制文件并通过使用gdb --pid命令附加进程,则可以正确获取完整的回溯。
另外,我尝试了pstack,但是(pstack-1.2-尝试了arm-patch,但这太可怕了……什么也没印出来)不是很有帮助。
有什么建议吗?
1)Makefile中的编译器选项
CFLAGS + = -g -fexceptions -funwind-tables -Werror $(WARN)...
2)代码
代码非常简单。
#define CALLSTACK_SIZE 10
static void print_stack(void) {
int i, nptrs;
void *buf[CALLSTACK_SIZE + 1];
char **strings;
nptrs = backtrace(buf, CALLSTACK_SIZE);
printf("%s: backtrace() returned %d addresses\n", __func__, nptrs);
strings = backtrace_symbols(buf, nptrs);
if(strings == NULL) {
printf("%s: no backtrace captured\n", __func__);
return;
}
for(i = 0; i < nptrs; i++) {
printf("%s\n", strings[i]);
}
free(strings);
} …Run Code Online (Sandbox Code Playgroud) 我有一个具有以下配置的系统;
当 SOFTIRQ 1 运行时,中断 B 出现,然后 ISR B 启动。当 ISR B 发生 irq_exit() 时,它将调用 softirq。因此,它将调度 SOFTIRQ 2(不处理被中断的 SOFTIRQ 1)。
是正确的说法吗?
另一个问题。此时,如果 SOFTIRQ 1 禁用“bottom_half”,我们检测到下半部分被禁用并跳过 SOFTIRQ 2 的执行?提前致谢!