Strace

如何追踪突然出現程序未終止的原因,而使用strace它會終止?

  • May 31, 2019

我有一個程序突然開始不終止(我沒有更新程序,但是我的系統和核心,我不記得是什麼導致了這種影響。重新編譯程序並沒有改變非終止行為)。但是,在 下strace,它確實終止。

這樣的事情怎麼能查到呢?

具體例子:

這是我遇到這個(對我來說)奇怪的事情的具體例子:

它是關於WWWOFFLESVN 修訂版2250(在調查/撰寫時最新),根據AUR-package在 Arch/Artix Linux 上編譯。

一段時間以來(沒有更新 WWWOFFLE,但更新了系統和核心,並且在出現此問題後重新編譯 WWWOFFLE 沒有明顯變化)將 wwwoffle 置於線上或離線模式經常無限期地掛起。如果我想用 追踪它 strace,它不會掛起。如果我將它包裝在一個 shell 腳本中,它會掛起strace,但不會掛起strace -f/ strace -ff

細節:

  1. 啟動wwwoffled伺服器:
wwwoffled -c /etc/wwwoffle/wwwoffle.conf -f -d 6
  1. 將 WWWOFFLE 置於線上模式(從離線模式切換到線上模式通常會成功):
wwwoffle -c /etc/wwwoffle/wwwoffle.conf -online

終端輸出:

WWWOFFLE Now Online

並返回呼叫shell。 3. 將 WWWOFFLE 置於離線模式:

wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline

終端輸出:

WWWOFFLE Now Offline

並且沒有終止。

根據數字 1的日誌wwwoffled正確地說Important: WWWOFFLE Offline。中止wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline<STRG>+<c>再次嘗試現在可以正確列印出來WWWOFFLE Already Offline,但也不會終止。 4. 當 WWWOFFLE 已經線上時切換到線上模式也不會終止:

wwwoffle -c /etc/wwwoffle/wwwoffle.conf -online

而 WWWOFFLE 已經線上確實可以正確列印出來

WWWOFFLE Already Online

但不會終止。 5. strace:

strace wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline

strace wwwoffle -c /etc/wwwoffle/wwwoffle.conf -online

確實似乎總是在wwwoffled像 1 中那樣啟動時終止。 6. 如果我將wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offlineandwwwoffle -c /etc/wwwoffle/wwwoffle.conf -online放入 bash 腳本中:

#!/bin/bash

wwwoffle -c /etc/wwwoffle/wwwoffle.conf -offline

並執行它,然後 strace也不會終止:

strace ./wwwoffle-off.sh

列印為最後一行

[...]
access("/usr/bin/wwwoffle", R_OK)       = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f36a75e1e50) = 6426
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x5573f5295be0, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f36a76898b0}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f36a76898b0}, 8) = 0
wait4(-1, WWWOFFLE Already Offline

並永遠在那裡等待。(注意WWWOFFLE Already Offline是 的輸出wwwoffle並寫入stdout,最後輸出 的strace,寫入stderr,是wait4(-1,) 7. 使用strace -for strace -ff(它也跟踪分叉的子執行緒),它再次終止。

我只在 WWWOFFLE 中看到它,但它可能不是 WWWOFFLE 問題。我不知道如何追踪它。如何追踪這些事情,什麼可能導致這種行為?

這通常是軟體內部出現某種問題的**症狀,無法給出一般性答案。

因此,它確實特定於顯示這種行為的具體軟體中的錯誤。

在 WWWOFFLE-case 中,監聽和之間的網路通信wwwoffle確實wwwoffled揭示了一些資訊。

引用自:https://unix.stackexchange.com/questions/517155