gpt4 book ai didi

c++ - 写入堆栈变量时出现 SEGFAULT

转载 作者:行者123 更新时间:2023-11-28 01:41:51 25 4
gpt4 key购买 nike

我在 ARM linux 平台上有一个由简单代码引起的非常奇怪的崩溃。问题是它很少重现(一天一次),另一个问题是它在实际上无法重现的地方崩溃。

让我们从 C++ 代码开始。线程函数执行此操作:

    event_obj events[EVENTS_MAX]; // EVENTS_MAX = 32
int num = 0;
m_engine->getEvents(events, &num);

engine 是指向目前只有一个实现的基抽象类的指针。 getEvents 是纯虚方法。

getEvents 在一些改变之后除了这个什么都不做

int engine::getEvents(event_obj*, int* num)
{
if (num != nullptr)
{
*num = 0; // SEGMENTATION FAULT
}
return 1; // ok
}

当试图在 num 中存储 0 时会发生 SEGFAULT。起初我以为是堆栈损坏,但在检查生成的汇编代码后,堆栈中似乎没有存储任何内容。此方法甚至没有生成堆栈保护(启用 -fstack-protector-strong),两个参数都存储在寄存器 r1 和 r2 中。让我们看看函数调用的代码:

        event_obj events[EVENTS_MAX];
int num = 0;
236f8: 2300 movs r3, #0
236fa: ac06 add r4, sp, #24
236fc: 9306 str r3, [sp, #24]
m_engine->getEvents(events, &num);
236fe: 6803 ldr r3, [r0, #0]
23700: 691b ldr r3, [r3, #16]
23702: 4622 mov r2, r4
23704: a90c add r1, sp, #48 ; 0x30
23706: 4798 blx r3

以及函数本身的代码:

int engine::getEvents(event_obj*, int* num)
{
if (num != nullptr)
251f8: 4613 mov r3, r2
251fa: b10a cbz r2, 25200 <_Z18engine_thread_funcPv+0x9e0>
{
*num = 0;
251fc: 2200 movs r2, #0
251fe: 601a str r2, [r3, #0]
}
return 1; // ok
}
25200: 2001 movs r0, #1
25202: 4770 bx lr
return 1; // ok
}

从生成的代码中可以看出,指针被放入 r1r2 寄存器。

   23702:       4622            mov     r2, r4
23704: a90c add r1, sp, #48 ; 0x30

即使堆栈已损坏,它也可能会损坏num 变量的值,但它怎么会损坏寄存器中的指针呢?同样从崩溃日志中我可以看到 LR 地址是错误的。

CRASH signal 11 Segmentation fault address 0xf0000000 PC 0x251fe LR 0x6c3c533c

从这里我唯一看不到的是跳转地址(blx r3),因为调用的方法是虚拟的。我有一个不太可能的假设,即它没有跳到虚方法体的第一行,而是跳到之前的几行并损坏了寄存器,但我不明白这怎么可能。它也总是在同一行崩溃,即使在更改代码之后也是如此。这很奇怪。

有人可以推荐一些尝试吗?有什么想法吗?

提前致谢。

最佳答案

故障发生是因为引擎不再有效。包含引擎的方法可能已被释放 - 即,您的线程内存已消失。因此,engine-getevents 在内存中甚至无效。您的代码中的其他地方发生了一些事情,线程应该停止运行并退出。他们没有。这很像对正在退出的应用程序的回调。

关于c++ - 写入堆栈变量时出现 SEGFAULT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com