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