Android source 在叉子内使用活页夹
我正在实现一个HAL组件,我正在为它创建一个测试。 测试实际上是在不同的进程中创建HAL回调的模拟,并将其自身注册到HAL。 换句话说,我模拟HAL的客户端,然后模拟导致事务失败的客户端崩溃,以测试HAL处理错误的能力。 问题是,试图在分叉内使用活页夹IPC会导致SEG故障。 读了这篇文章,从中我了解到HwBinder线程通过链接到libbiner自动启动 假设Android source 在叉子内使用活页夹,android-source,hal,android-binder,hidl,Android Source,Hal,Android Binder,Hidl,我正在实现一个HAL组件,我正在为它创建一个测试。 测试实际上是在不同的进程中创建HAL回调的模拟,并将其自身注册到HAL。 换句话说,我模拟HAL的客户端,然后模拟导致事务失败的客户端崩溃,以测试HAL处理错误的能力。 问题是,试图在分叉内使用活页夹IPC会导致SEG故障。 读了这篇文章,从中我了解到HwBinder线程通过链接到libbiner自动启动 假设fork()不复制父线程的运行线程,这意味着fork进程将找不到helper HwBinder线程,或者它假定它存在并尝试使用它 这会产
fork()
不复制父线程的运行线程,这意味着fork进程将找不到helper HwBinder线程,或者它假定它存在并尝试使用它
这会产生一系列错误,最终导致SEGV_映射错误
我的问题是,是否有必要在我的分叉子线程中重新启动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);
}
您是否打算测试HAL或跨流程实现?在第一种情况下,您可能不需要创建整个单独的流程来测试HAL 通常的做法是:
- 提供默认HAL实现,可能是模拟()
- 为HAL()实现VTS测试,该测试也可以针对真实的HAL运行
- 在设备启动时(或仅从
)运行默认实现,并单独进行VTS测试adb shell
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)