我尝试使用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
失败了,为什么我不能调试这个过程。
1条答案
按热度按时间aydmsdu91#
我如何检查
pthread_mutex_init
失败的原因?我可以看到errno吗?pthreads函数是在失败时返回错误号而不是设置
errno
变量的函数之一。对于任何不能合理忽略其失败的函数调用,程序必须检查对
pthread_mutex_init
的调用是否失败。这个习惯用法已经足够通过调试器(至少是本机调试器)轻松查看错误号了。我不确定我能否解释您报告的
gdb-multiarch
行为,但我怀疑问题在于您在程序启动后连接,但试图在(进入)main
时中断。问题仍然存在,但是,你实际上是如何处理错误的。在某些情况下,你可能想打印一条诊断消息。
perror()
函数在这方面相当不错,但它使用errno
来确定要发出什么消息,所以也许...然而,仅仅消息传递很少是足够的,在大多数情况下,你会希望终止程序或用失败代码中止函数。
还要注意的是,为了保证程序的健壮性和可预测性,程序通常需要沿着这些方面进行大量的错误检查。你可能会发现,提供一个或多个宏和/或函数来代替所有的样板错误处理,会使代码更清晰。