在 fork 中使用 HwBinder
Using HwBinder inside fork
我正在实施一个正在为其创建测试的 HAL 组件。
该测试实际上是关于在不同的进程中创建 HAL 回调的模拟,并将其自身注册到 HAL。
也就是说,我是在mock HAL的client,然后模拟一个client crash导致事务失败来测试HAL处理错误的能力。
问题是,尝试在 fork 中使用 Binder IPC 会导致段错误。
阅读本文 question and from the documentation 我了解到 HwBinder 线程通过链接到 libbiner 自动启动。
鉴于fork()
不复制父进程的运行线程,这意味着分叉进程将找不到helper 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)
我正在实施一个正在为其创建测试的 HAL 组件。 该测试实际上是关于在不同的进程中创建 HAL 回调的模拟,并将其自身注册到 HAL。 也就是说,我是在mock HAL的client,然后模拟一个client crash导致事务失败来测试HAL处理错误的能力。 问题是,尝试在 fork 中使用 Binder IPC 会导致段错误。 阅读本文 question and from the documentation 我了解到 HwBinder 线程通过链接到 libbiner 自动启动。
鉴于fork()
不复制父进程的运行线程,这意味着分叉进程将找不到helper 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)