小编use*_*111的帖子

如何在过程信号处理程序(armv7-uclibc)中获得正确的回溯?

我已经做了很多次google来在信号处理程序中找到backtrace()的正确解决方案,并尝试了几乎所有方法,但是我无法在我的信号处理程序中成功获取backtrace-这不是SIGUSR1处理程序。

  • 在uclibc配置中启用UCLIBC_HAS_BACKTRACE = y并对其进行编译
  • 验证是否创建了libubacktrace.so
  • 使用以下选项-g -rdynamic -fexception或-funwind-tables编译了我的应用程序二进制文件
  • 二进制文件本身似乎已被“剥离”

但是,我无法从信号处理程序获得完整的回溯。仅打印我在信号处理程序中调用的函数地址。

如果我使用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)

linux arm uclibc

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

SOFTIRQ 上下文之间的抢占

我有一个具有以下配置的系统;

  • SMP 平台(但我只关注本地 CPU)和抢占关闭
  • ISR A -> raise_softirq(1)
  • ISR B -> raise_softirq(2)

当 SOFTIRQ 1 运行时,中断 B 出现,然后 ISR B 启动。当 ISR B 发生 irq_exit() 时,它将调用 softirq。因此,它将调度 SOFTIRQ 2(不处理被中断的 SOFTIRQ 1)。

是正确的说法吗?

另一个问题。此时,如果 SOFTIRQ 1 禁用“bottom_half”,我们检测到下半部分被禁用并跳过 SOFTIRQ 2 的执行?提前致谢!

linux-kernel interrupt-handling

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

标签 统计

arm ×1

interrupt-handling ×1

linux ×1

linux-kernel ×1

uclibc ×1