簡體   English   中英

在 fork 中使用 HwBinder

[英]Using HwBinder inside fork

我正在實現一個 HAL 組件,我正在為其創建一個測試。 該測試實際上是關於在不同的進程中創建 HAL 回調的模擬,並將其自身注冊到 HAL。 換句話說,我在模擬 HAL 的客戶端,然后模擬導致事務失敗的客戶端崩潰來測試 HAL 處理錯誤的能力。 問題是,嘗試在 fork 中使用 Binder IPC 會導致段錯誤。 閱讀這個問題並從文檔中我了解到 HwBinder 線程通過鏈接到 libbiner 自動啟動。

鑒於fork()不復制父進程的運行線程,這意味着分叉進程將找不到幫助程序 HwBinder 線程,或者它確實假設它存在並嘗試使用它?

這會產生一連串錯誤,最終出現 SEGV_MAPERR。

我的問題是,是否可以在不必使用exec情況下重新啟動我分叉的孩子內部的 HwBinder 線程?

這是我的代碼:

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 或跨進程 HwBinder 實現? 在第一種情況下,您可能不需要創建一個完整的單獨進程來測試您的 HAL。

通常的做法是:

  • 提供默認的 HAL 實現,它可能是一個模擬( 示例
  • 為 HAL 實施 VTS 測試( 示例),它也可以針對真實的 HAL 運行
  • 在設備啟動時(或僅從adb shell )運行默認實現並分別進行 VTS 測試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM