gpt4 book ai didi

c++ - MIPS 上 pthreads 中的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:32 25 4
gpt4 key购买 nike

我正在尝试在 MIPS Linux 机器上运行我的代码(小端,没有硬件 float ):

# cat /proc/cpuinfo | grep model
cpu model : MIPS 24Kc V5.5

我的程序在 x86 和 ARM 系统上运行良好,但在 MIPS 上因段错误而崩溃,总是在(或接近)pthreads 库函数调用中。我尝试了两个工具链(来自 here 的 MTI GNU/Linux 工具链 MIPS32R2-MIPS32R5 和来自 here 的 Sourcery CodeBench Lite 2016.05-8)——细节略有不同,但段错误总是发生。

阅读邮件列表我发现了 MIPS 平台上 pthreads 段错误的两个原因:

  • 在 uClibc 的 MIPS 版本中 pthread_unlock_mutex()pthread_wait_cond() 的实现可能有误。但是我使用 glibc(尽管设备上的操作系统是基于 uClibc 的);
  • pthreads 中的动态库加载问题;但我的程序是静态链接的。

我写了一个非常简单的程序:

#include <chrono>
#include <iostream>
#include <thread>

using namespace std;

void sayHello() {
this_thread::sleep_for(chrono::seconds(2));
cout << "Hello world!" << endl;
}

int main(int argc, char* argv[]) {
thread t(sayHello);
t.join();
return 0;
}

它也在 MIPS 上崩溃。在 t.join() 断点的调试器中,我看到以下内容:

(gdb) c
Continuing.

Breakpoint 1, __start () at ../sysdeps/mips/start.S:84
84 in ../sysdeps/mips/start.S
(gdb) disassemble
Dump of assembler code for function __start:
0x004059b0 <+0>: lui gp,0x5b
0x004059b4 <+4>: addiu gp,gp,-30464
=> 0x004059b8 <+8>: move ra,zero
0x004059bc <+12>: lui a0,0x40
0x004059c0 <+16>: addiu a0,a0,21584
0x004059c4 <+20>: lw a1,0(sp)
0x004059c8 <+24>: addiu a2,sp,4
0x004059cc <+28>: li at,-8
0x004059d0 <+32>: and sp,sp,at
0x004059d4 <+36>: addiu sp,sp,-32
0x004059d8 <+40>: lui a3,0x4d
0x004059dc <+44>: addiu a3,a3,-208
0x004059e0 <+48>: lui t0,0x4d
0x004059e4 <+52>: addiu t0,t0,4
0x004059e8 <+56>: sw t0,16(sp)
0x004059ec <+60>: sw v0,20(sp)
0x004059f0 <+64>: jal 0x4cf8a0 <__libc_start_main>
0x004059f4 <+68>: sw sp,24(sp)
End of assembler dump.
… (some boring "n"-s here) …
(gdb) n
109 in ../sysdeps/mips/start.S
(gdb) disassemble
Dump of assembler code for function __start:
0x004059b0 <+0>: lui gp,0x5b
0x004059b4 <+4>: addiu gp,gp,-30464
0x004059b8 <+8>: move ra,zero
0x004059bc <+12>: lui a0,0x40
0x004059c0 <+16>: addiu a0,a0,21584
0x004059c4 <+20>: lw a1,0(sp)
0x004059c8 <+24>: addiu a2,sp,4
0x004059cc <+28>: li at,-8
0x004059d0 <+32>: and sp,sp,at
0x004059d4 <+36>: addiu sp,sp,-32
0x004059d8 <+40>: lui a3,0x4d
0x004059dc <+44>: addiu a3,a3,-208
0x004059e0 <+48>: lui t0,0x4d
0x004059e4 <+52>: addiu t0,t0,4
0x004059e8 <+56>: sw t0,16(sp)
0x004059ec <+60>: sw v0,20(sp)
=> 0x004059f0 <+64>: jal 0x4cf8a0 <__libc_start_main>
0x004059f4 <+68>: sw sp,24(sp)
End of assembler dump.
(gdb) n
[New Thread 29775]

Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) info registers
zero at v0 v1 a0 a1 a2 a3
R0 00000000 00000000 00000016 005af490 2bc7d310 00000000 2bc7d378 00000000
t0 t1 t2 t3 t4 t5 t6 t7
R8 00000000 00000000 00000000 82ee2000 00000000 00000000 00000001 74697773
s0 s1 s2 s3 s4 s5 s6 s7
R16 7fbbf194 004450c4 00464200 004641f0 00460000 2b929478 0045742c 00000001
t8 t9 k0 k1 gp sp s8 ra
R24 00000000 00000000 2bc847a0 00000000 005a8900 7fbbf158 7f894280 0041bd54
status lo hi badvaddr cause pc
0100ff13 3b9aca00 00000000 00000000 50800008 00000000
fcsr fir hi1 lo1 hi2 lo2 hi3 lo3
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
dspctl restart
00000000 00000000

没有线程的示例程序运行良好。

我现在可以做什么?是否有人对 MIPS 上的 pthreads 有类似的体验?

最佳答案

回答我自己的问题。

Erik Alapää是的,使用 uClibc 构建解决了这个问题。我仍然不明白为什么(程序是静态链接的)。

顺便说一句:我使用 glibc 因为无法使用 uClibc 构建 Boost.Asio — pthreads 从我的工具链中使用 uClibc 构建的库不包含 pthread_condattr_setclock() 函数.使用以下 Boost.Asio 补丁修复了它:

diff --git a/include/boost/asio/detail/impl/posix_event.ipp b/include/boost/asio/detail/impl/posix_event.ipp
index 4ff246f3..04f87a3a 100644
--- a/include/boost/asio/detail/impl/posix_event.ipp
+++ b/include/boost/asio/detail/impl/posix_event.ipp
@@ -33,10 +33,12 @@ posix_event::posix_event()
: state_(0)
{
#if (defined(__MACH__) && defined(__APPLE__)) \
- || (defined(__ANDROID__) && (__ANDROID_API__ < 21))
+ || (defined(__ANDROID__) && (__ANDROID_API__ < 21)) \
+ || (defined(__UCLIBC__))
int error = ::pthread_cond_init(&cond_, 0);
#else // (defined(__MACH__) && defined(__APPLE__))
// || (defined(__ANDROID__) && (__ANDROID_API__ < 21))
+ // || (defined(__UCLIBC__))
::pthread_condattr_t attr;
::pthread_condattr_init(&attr);
int error = ::pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
@@ -44,7 +46,7 @@ posix_event::posix_event()
error = ::pthread_cond_init(&cond_, &attr);
#endif // (defined(__MACH__) && defined(__APPLE__))
// || (defined(__ANDROID__) && (__ANDROID_API__ < 21))
-
+ // || (defined(__UCLIBC__))
boost::system::error_code ec(error,
boost::asio::error::get_system_category());
boost::asio::detail::throw_error(ec, "event");

好吧,这是一种拼凑,但它确实有效。

关于c++ - MIPS 上 pthreads 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51153677/

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