總覽
Just In Time Debugging (JITD) 是讓 Fuchsia 暫停處理程序時, 之後可對提案者進行偵錯/處理。這會允許特定流程,例如將 zxdb 未連結/執行偵錯工具時,程式整晚當機。
將處理程序儲存在名為「Process Limbo」的特殊位置中。這個 這些程序會保持暫停狀態,直到其他服務專員派出去為止。
如要進一步瞭解運作方式,請參閱「導入」一節。
啟用方式
Process Limbo 最大優勢之一,就是能夠找出 而無需自行執行偵錯工具。這項功能特別適用於 「無法」執行偵錯工具的地方,例如驅動程式庫啟動在這種情況下 程序 Limbo 可以提供寶貴的偵錯資訊來源。
啟用 Process Limbo 的方法有兩種:
手動啟用
以下 ffx 外掛程式可讓使用者查詢 Lmbo 的目前狀態:
$ ffx debug limbo --help
Usage: ffx debug limbo <command> [<args>]
control the process limbo on the target
Options:
--help display usage information
Commands:
status query the status of the process limbo.
enable enable the process limbo. It will now begin to capture
crashing processes.
disable disable the process limbo. Will free any pending processes
waiting in it.
list lists the processes currently waiting on limbo. The limbo
must be active.
release release a process from limbo. The limbo must be active.
See 'ffx help <command>' for more information on a specific command.
啟動時啟用
只有在您需要向系統傳送指令時,手動啟動才會正常運作。但有些發展 環境執行的軟體,讓使用者提早執行軟體 (或執行偵錯工具)。驅動因素 這裡就是很好的例子如果是這種情況,一開始就啟用 Process Limbo,您可以 驅動程式庫程式會在駕駛座時當機,但這通常最難 偵錯。
為此,您必須在建構作業中設定一個設定:
fx set <YOUR CONFIG> --with-base //src/developer/forensics:exceptions_enable_jitd_on_startup
或者將這個標籤新增至建構引數中的 base_package_labels
。您仍然可以
Limbo CLI 工具,可停用及操控之後的 limbo。接著,您需要推送更新
即會生效。
注意:驅動程式初始化作業很複雜,當機程序凍結可能會使系統停止運作 未定義狀態並「停止運作」因此,使用這項功能時,您的里程數可能會不同,尤其是對於 早期司機
使用方式
zxdb
JITD 的主要使用者是 zxdb,可附加至在 limbo 中等待的程序上。時間 啟動 zxdb,會自動附加至等待 limbo 的處理程序:
$ ffx debug connect
Connecting (use "disconnect" to cancel)...
Connected successfully.
👉 To get started, try "status" or "help".
Processes attached from limbo:
48487: crasher
Type "detach <pid>" to send back to Process Limbo if attached,
type "detach <pid>" again to terminate the process if not attached, or
type "process <process context #> kill" to terminate the process if attached.
See "help jitd" for more information on Just-In-Time-Debugging.
Process "crasher" (48487) crashed and has been automatically attached.
Type "status" for more information.
Attached Process 1 state=Running koid=48487 name=crasher component=sshd-host.cm
Loading 9 modules for crasher Done.
23
24 int blind_write(volatile unsigned int* addr) {
▶ 25 *addr = 0xBAD1DEA;
26 return 0;
27 }
════════════════════════════════════════════════════════════════════════════
Data fault writing address 0x0 (translation fault level 2) (second chance)
════════════════════════════════════════════════════════════════════════════
Process 1 (koid=48487) thread 1 (koid=48489)
Faulting instruction: 0x642ff060
🛑 blind_write(volatile unsigned int*) • crasher.c:25
[zxdb] thread
# state koid name
▶ 1 Blocked (Exception) 58692 initial-thread
[zxdb] frame
▶ 0 blind_write(…) • crasher.c:25
1 main(…) • crasher.c:356
2…4 «libc startup» (-r expands)
[zxdb] list
20 int (*func)(volatile unsigned int*);
21 const char* desc;
22 } command_t;
23
24 int blind_write(volatile unsigned int* addr) {
▶ 25 *addr = 0xBAD1DEA;
26 return 0;
27 }
28
29 int blind_read(volatile unsigned int* addr) { return (int)(*addr); }
30
31 int blind_execute(volatile unsigned int* addr) {
32 void (*func)(void) = (void*)addr;
33 func();
34 return 0;
35 }
在 zxdb 中,您還可以執行 help jitd
,以進一步瞭解如何使用此工具。
處理 Limbo FIDL 服務
Process Limbo 顯示為 FIDL 服務,也就是 Process Limbo CLI 工具
zxdb 的使用。//sdk/fidl/fuchsia.exception/process_limbo.fidl
中定義了 FIDL 通訊協定。
實作
當機服務
程序擲回例外狀況時,Zircon 會產生相關聯的 exception handle
。這會導致
然後查看是否有任何事件監聽器可能感興趣的相關例外頻道
來處理這項例外狀況這就是 zxdb 這類偵錯工具無法執行時
作業。詳情請參閱例外狀況處理。
但由於沒有任何或全部的例外狀況處理常式,在沒有其他例外狀況處理常式的情況下
根工作有一個名為 crashsvc
的專屬處理常式,並決定傳遞處理。我們
例外狀況與當機服務例外狀況,目前系統理解其已「當機」而且沒有程式
完全不必處理接著,當機服務會將停止運作的堆疊追蹤轉儲到記錄檔中
將例外狀況傳遞至 Exception Broker
。
例外狀況代理程式
例外狀況代理程式會負責判斷發生異常終止時應執行什麼動作 會視實際的系統設定而定因此可能會決定建立 minidump 檔案 當機報告、將例外狀況傳送至 Process Limbo,或者終止該程序。
例外狀況代理程式瞭解 Process Limbo,以及其是否為啟用狀態。收到時間 例外狀況,系統會檢查是否已啟用 Process Limbo。如果有,就會傳遞例外狀況 來處理事件這與 FIDL 服務公開的 Process Limbo 相同。