0

我正在实现一个 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)
4

1 回答 1

0

您是否打算测试您的 HAL 或跨进程 HwBinder 实现?在第一种情况下,您可能不需要创建一个完整的单独流程来测试您的 HAL。

通常的做法是:

  • 提供默认的 HAL 实现,它可能是一个模拟(示例
  • 为 HAL 实施 VTS 测试(示例),它也可以针对真正的 HAL 运行
  • 在设备启动(或仅从)运行默认实现adb shell并分别进行 VTS 测试
于 2020-12-04T21:10:24.183 回答