[英]How to fix Native Host Has Exited error in Chrome browser extension — Native Messaging
如何修復Mac版Chrome瀏覽器擴展程序中的“本地主機已退出”錯誤? Native Messaging上的文檔在底部特別提到了此錯誤,並提出了可能的原因,但是這種說法相當籠統(“這很可能是從您的本機消息傳遞主機發起的”),目前尚不清楚嘗試解決什么問題這個。
Terminal中的日志記錄輸出(如果您從Mac Terminal啟動Chrome,則可以查看日志記錄信息)使我相信,本地主機應用程序本身的過程永遠不會成功啟動。 我不斷得到:
LaunchProcess: failed to execvp:
/Users/mycomputer1/Documents/myhost.app
但是,在后台javascript頁面上向控制台輸出“本地主機已退出”的實際代碼是:
function onDisconnected() {
console.log("Inside onDisconnected(): " + chrome.runtime.lastError.message);
port = null;
}
onDisconnected()偵聽器實際上是通過調用connectNative()的結果而調用的,根據文檔,我在這里已完成此操作:
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
//var imgdata = JSON.stringify(request.imgdata);
//process it somehow here
port = chrome.runtime.connectNative("com.allinlearning.ailhost");
if (port)
{
console.log("connectNative() returned a non-null port");
}
});
我知道connectNative()在某種程度上成功了,它返回了一個有效的端口。 但是,connectNative()繼續嘗試查找本機主機應用程序並嘗試啟動它。 該文檔表明,主機應用程序是罪魁禍首,盡管我的主機應用程序根本沒有實現與stdout或stdin的通信,但它以某種方式引發了Chrome與本機應用程序之間的“管道”中斷。 此外,Chrome日志消息(“ LaunchProcess:無法執行execvp:”)似乎表明我的Mac應用程序從未成功啟動。
還有更多:我在網上找到的一些源代碼(也許是已過時的日期? 源文件 )揭示了該“本機主機已退出”消息的確切來源,而一項檢查則表明了為什么Google Chrome的代碼會導致一切關閉。 在HandleReadResult()中,調用Close()來提供非常大的味精,然后響應Posix read()返回0來關閉內容。但是在廣泛的體育世界中,我做錯了(或根本沒有做)在我的Mac應用程序中導致讀取失敗? 我的Mac應用程序未向stdout寫入任何內容,那么什么都不寫入會導致讀取錯誤? 還是所有這些都誤導了我,而execvp無法啟動我的主機應用程序是更深層的原因? 如果是這樣,為什么? 這是一個純簡陋的Mac應用程序。
您的“ myhost.app”不是二進制文件,而是目錄(如u+w,go-w,a+rX
權限中的X所示)。
您有兩種選擇:
請勿為您的命令行程序創建應用程序捆綁包,而不要為普通的命令行應用程序(Xcode中的File> New> Project> Command Line Tool( 教程 ))創建應用程序捆綁包。
在應用程序捆綁包中指定二進制文件的路徑,而不是捆綁包本身。 您可以通過右鍵單擊.app文件並選擇“顯示包內容”來列出應用包中的所有文件。 或從終端(控制台)運行以下命令以列出捆綁包中的所有文件:
find /Users/mycomputer1/Documents/myhost.app -type f
您的本機應用程序和chrome通過控制台進行通信,該控制台在大多數情況下是隱藏的。 如果您的應用將控制台用於與chrome通信(例如執行系統命令)以外的其他操作,則chrome會捕獲該錯誤並將其解釋為來自您的應用的錯誤響應,並關閉它們之間的連接。
因此,建議您使用以下解決方法之一:
需要注意的另一件事是,在某些語言(例如php)中,某些命令(例如preg_match)似乎沒有任何輸出,因為它們根據其參數對數據進行操作,但是它們確實會返回結果(例如true / false),並且如果您不抑制該結果(php中的@function())或將其保存到變量中,則它將轉到stdout並導致chrome斷開連接。
抱歉,如果與該問題沒有直接關系,但是希望此問題對搜索結果有所幫助,這對某些人有幫助。 我自己,在這個問題上掙扎了好幾個小時。
在Linux(RHEL 7.6)上發生了。
要找到根本原因,您需要從控制台(命令行)運行chrome,然后打開gnome擴展頁面:
$ /opt/google/chrome/chrome "https://extensions.gnome.org"
然后在控制台中查看是否有任何錯誤。
對我來說,這是'chrome-gnome-shell'錯誤,原因是缺少名為'gi'的python模塊:
Traceback (most recent call last):
Traceback (most recent call last):
File "/usr/bin/chrome-gnome-shell", line 16, in <module>
from gi.repository import GLib, Gio
ModuleNotFoundError: No module named 'gi'
要修復它,我必須安裝PyGObject :
$ sudo yum install python36-gobject.x86_64
# or directly with pip: pip3 install PyGObject
安裝完成后,請返回https://extensions.gnome.org (可能需要關閉並重新打開Chrome)-現在它沒有顯示任何錯誤,並且運行良好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.