我正在实现一个 HAL 组件,我正在为其创建一个测试。该测试实际上是关于在不同进程中创建 HAL 回调的模拟,并将其自身注册到 HAL。换句话说,我是在模拟 HAL 的客户端,然后模拟客户端崩溃导致事务失败,以测试 HAL 处理错误的能力。问题是,尝试在 fork 中使用 Binder IPC 会导致段错误。阅读这个问题并从文档中我了解到 HwBinder 线程通过链接到 libbiner 自动启动。
鉴于fork()
不复制父进程的正在运行的线程,这意味着分叉的进程将找不到助手 HwBinder 线程,或者它确实假设它存在并尝试使用它?
这会产生一系列错误,最终会产生 SEGV_MAPERR。
我的问题是,无论如何都可以在我的分叉孩子中重新启动 HwBinder 线程而不必使用exec
?
这是我的代码:
pid_t pid = fork();
if (pid == 0) {
using namespace ::android::hardware;
using namespace testing;
/**
* Crash happens here
*/
android::sp<IMyHal> iMyHal = IMyHal::getService();
IMyHal->deregisterMyHalCallback();
sp<MockIMyHalCallback> callbackMock(new MockIMyHalCallback());
iMyHal->deregisterMyHalCallback(callbackMock);
Status hidlStatus;
hidlStatus.setException(Status::EX_TRANSACTION_FAILED, "Transaction Failed");
EXPECT_CALL(*callbackMock, testFunction(Eq("1"), _))
.WillOnce(DoAll(testing::Return(ByMove(android::hardware::Return<void>(hidlStatus)))))
.Times(Exactly(1));
} else if (pid > 0) {
/**
* This will trigger iMyHal to call callbackMock.testFunction();
*/
mProxy->callTestFunction("1", 2);
}
这会导致此错误:
2020-10-30 19:18:31.440 18917-18917/? A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xef400000 in tid 18917 (vendor.xxx.remo), pid 18917 (vendor.xxx.remo)