我尝试使用 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
失败以及为什么我无法调试该过程。
如何检查
失败的原因?我可以看到错误号吗?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");
然而,仅靠消息传递是远远不够的。在大多数情况下,您需要终止程序或使用故障代码中止该功能。
还要注意,为了稳健性和可预测性,程序通常需要按照这些思路进行大量错误检查。您可能会发现提供一个或多个宏和/或函数来替换所有样板错误处理使您的代码更加干净和清晰。