「strace」を使ってシャットダウン中にプログラムが突然終了しない理由を見つける方法は?

「strace」を使ってシャットダウン中にプログラムが突然終了しない理由を見つける方法は?

プログラムが突然終了しなくなり始めました(プログラムを更新したのではなく、システムとカーネルを更新しましたが、この効果の原因が何であるか覚えていません。プログラムを再コンパイルしても非終了動作は変わりません)。ただし、以下ではstrace終了します。

このようなことをどのように追跡できますか?

具体的な例:

以下は、私が奇妙なことを経験した具体的な例です。

それは薬ですワールドワイドウェブSVN改訂2250(研究/作成時の最新)、Arch/Artix Linuxでコンパイル済みAURパッケージ

WWWOFFLEを更新せずにシステムとカーネルを更新し、この問題が発生した後に顕著な変更なしにWWWOFFLEを再コンパイルする場合、wwwoffleをオンラインまたはオフラインモードに設定すると無期限に中断されることがよくあります。追跡しようとすると strace停止しません。シェルスクリプトでラップすると suspension では機能しますstraceが、strace -f/suspens では機能しませんstrace -ff

詳細:

  1. wwwoffledサーバーを起動します。

    wwwoffled -c /etc/wwwoffle/wwwoffle.conf -f -d 6
    
  2. WWWOFFLEをオンラインモードに設定します。 (オフラインからオンラインモードに切り替えると通常成功します。)

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

    ターミナル出力:

    WWWOFFLE Now Online
    

    呼び出しシェルに戻ります。

  3. WWWOFFLEをオフラインモードに切り替えます。

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

    ターミナル出力:

    WWWOFFLE Now Offline
    

    そして終了はありません。

    wwwoffled記事1によると、ログの内容は正しいです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
    

    wwwoffled1のように起動時に常に終了するようです。

  6. bashスクリプトにwwwoffle -c /etc/wwwoffle/wwwoffle.conf -offlineandを置くと:wwwoffle -c /etc/wwwoffle/wwwoffle.conf -online

    #!/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最後の出力はです。)stracestderrwait4(-1,

  7. strace -for(分岐したサブスレッドも追跡)を使用するとstrace -ff再び終了します。

WWWOFFLEでしか見ていませんが、WWWOFFLEの問題ではないようです。私はそれを追跡する方法を知りません。これらのことをどのように追跡し、この動作の原因は何ですか?

ベストアンサー1

これは通常次の症状です。ソフトウェアに問題があります一部方法では一般的な回答はできません。

したがって、これは実際にこれらの動作を示す特定のソフトウェアのバグにのみ当てはまります。

WWWOFFLEの場合との間のネットワークトラフィックを聞くと、wwwoffle実際にwwwoffledいくつかの情報が明らかになります。

おすすめ記事