"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일부 정보가 드러납니다.

관련 정보