3

我提供的信息非常有限,我知道,但这可能就足够了。

系统规格: MIPS 64 位处理器,8 个内核,每个内核运行 4 个虚拟 CPU。

操作系统:一些基于 2.6.32.9 内核的专有 Linux

进程:一个运行 7 个 posix 线程的简单用户级进程。这个特定的应用程序在核心 0 上运行,它与任何进程都没有任何 cpu 亲和性。

崩溃几乎不可能重现。没有具体的场景。我们知道,如果我们对应用程序执行一些次要活动,它可能每天崩溃一次。

崩溃的特定线程每 5 毫秒唤醒一次,从一个共享内存区域读取信息并更新另一个。而已。

没有太多的活动。这个过程不是很辛苦。

现在:当我打开核心并加载应用程序的无符号图像时,gdb 指向指令 100661e0。指令 100661e0 如下所示(使用未剥离图像的 objdump 视图查看):

void class::foo(uint8_t factor)
{
    100661d8:   ffbf0018        sd      ra,24(sp)
    100661dc:   0080802d        move    s0,a0
    bar(factor, shared_memory_a->profiles[PROFILE_1]);
    100661e0:   0c019852        jal     10066148 <_ZN28class35barEhR30profile_t>
    100661e4:   64c673c8        daddiu  a2,a2,29640
    bar(factor, shared_memory_a->profiles[PROFILE_2]);
    100661e8:   de060010        ld      a2,16(s0)

显示为异常行的行是

100661e0:   0c019852        jal     10066148 <_ZN28class35barEhR30profile_t>

请注意,10066148 是有效指令。

Bad 寄存器包含以下地址,该地址已对齐,但就指令地址空间而言看起来无效:c0000003ddc5dd90

原因寄存器包含以下值:0000000000800014

我不明白为什么 Bad 寄存器会显示它的值,其中指令明确说明了有效指令。我有点担心分支延迟槽问题,但是当我使用简单的 C++ 运行用户态应用程序时,我不应该担心这些问题。

我会很感激任何想法。

4

0 回答 0