debugging 使用qemu aarch-64时pthread_mutex_init失败

rta7y2nd  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(134)

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

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

问题是我在日志中看到pthread_mutex_init(在so文件中实现)失败
我如何检查pthread_mutex_init失败的原因?我可以看到errno吗?
我试着调试这个进程,也许是为了看看这个函数的返回值,但它不起作用。
使用chroot . ./qemu-aarch64-static -g 1234 ./myProcess
然后连接gdb-multiarch

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

但这个过程并不止于主节点
所以我不知道为什么pthread_mutex_init失败了,为什么我不能调试这个过程。

aydmsdu9

aydmsdu91#

我如何检查pthread_mutex_init失败的原因?我可以看到errno吗?
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");

然而,仅仅消息传递很少是足够的,在大多数情况下,你会希望终止程序或用失败代码中止函数。
还要注意的是,为了保证程序的健壮性和可预测性,程序通常需要沿着这些方面进行大量的错误检查。你可能会发现,提供一个或多个宏和/或函数来代替所有的样板错误处理,会使代码更清晰。

相关问题