How does it work internally

Crash interception

Apport會使用『/proc/sys/kernel/core_pattern』去直接的傳送(pipe) core dump到apport裡面:

$ cat /proc/sys/kernel/core_pattern | /usr/share/apport/apport %p %s %c
$ 

這邊注意一下,就算ulimit已經設定為不允許 core files,apport仍然會抓取這個crash。 而為了攔截Python的crash,它也安裝了/etc/python*/sitecustomize.py,這個檔案會在發生沒有handled的例外處理(exceptions)下去呼叫apport。

底下是一個upstart (PID=1)crash掉,然後apport去抓到他的core file的案例:

  1. 如果Upstart偵測到了內部的錯誤,它會發起一個SIGABRT的訊號。
  2. Upstart的crash handler叫做SIGABRT。
  3. Upstart的crash handler folks一個子行程(child process)。
  4. Upstart的子行程再次發起了一個訊號,而這個訊號將會造成這個子行程異常的結束。
  5. 這時候Kernel偵測到了這個子行程的異常結束,所以它會呼叫apport,傳送core file到apport的stdin(/proc/sys/kernel/core_pattern)。
  6. apport將core file寫到/var/crash/裡。
  7. PID1將會等到他的子行程結束(也就是apport完成寫入core file)。
  8. PID1結束。
  9. kernel panics。
  10. 在下一個開機時,Whoopsie將會偵測到這個crash file並且處理它。

Backend

為了保持CPU/IO不會有花費太多資源,/usr/share/apport/apport只會收集當crash的行程還存在時的資料:像是/proc/pid, core dump, 執行路徑, 序號編號等等。這個report將會被寫到/var/crash/excutable_path.uid.crash.

Frontend invocation

如果你的桌面環境是使用Gnome的話,update-notifier會一直去監視/var/crash,只要那邊有新的東西,他就會呼叫/usr/share/apport/apport-checkrepoarts。如果有新的report,他就會呼叫/usr/share/apport/apport-gtk,這個就會啟動如同上面所顯示的介面。

然後這個frontend就會收集所有額外像是套件版本,套件檔名的checksums,OS版本,並且呼叫所有符合的套件hooks>

如果你想要取消這個功能的話,你可以執行以下:

gsettings set com.ubuntu.update-notifier show-apport-crashes false

results matching ""

    No results matching ""