使用 qemu aarch-64 时 pthread_mutex_init 失败

问题描述 投票:0回答:1

我尝试使用 qemu 模拟 aarch64 二进制文件,我复制了该二进制文件依赖的所有库。并使用 chroot 运行它:

chroot . ./qemu-aarch64-static ./myProcess

问题是我在日志中看到

pthread_mutex_init
(在so文件中实现)失败了

如何检查

pthread_mutex_init
失败的原因?我可以看到错误号吗?

我尝试调试该进程`也许是为了查看该函数的返回值,但它不起作用。

使用

chroot . ./qemu-aarch64-static -g 1234 ./myProcess

然后连接 gdb-multiarch

file myProcess
set architecture aarch64
target remote 127.0.0.1:1234
b main
c

但是这个过程并没有停止在main

所以我不知道为什么

pthread_mutex_init
失败以及为什么我无法调试该过程。

debugging pthreads embedded-linux qemu arm64
1个回答
0
投票

如何检查

pthread_mutex_init
失败的原因?我可以看到错误号吗?

pthreads 函数是在失败时返回错误号而不是设置

errno
变量的函数。

与您无法合理忽略其失败的任何函数调用一样,您的程序必须检查对

pthread_mutex_init
的调用是否失败。自然的习语是

    int result;

    // ...

    result = pthread_mutex_init(&my_mutex, NULL);  // assumes default mutex attributes
    if (result != 0) {
        // ... handle error ...
    }

这个习惯用法已经足以通过调试器(至少是本机调试器)轻松查看错误号。我不确定我能否解释您报告的行为

gdb-multiarch
,但我怀疑问题在于您在程序启动后进行连接,但试图在(进入)
main
处中断。

但问题仍然是,您如何实际处理该错误。在某些情况下,您可能想要打印诊断消息。

perror()
函数对此相当不错,但它使用
errno
来确定要发出什么消息,所以也许......

        errno = result;
        perror("pthread_mutex_init");

然而,仅靠消息传递是远远不够的。在大多数情况下,您需要终止程序或使用故障代码中止该功能。

还要注意,为了稳健性和可预测性,程序通常需要按照这些思路进行大量错误检查。您可能会发现提供一个或多个宏和/或函数来替换所有样板错误处理使您的代码更加干净和清晰。

© www.soinside.com 2019 - 2024. All rights reserved.