Linux 중단을 디버깅하는 방법은 무엇입니까?

Linux 중단을 디버깅하는 방법은 무엇입니까?

우리는 커널 버전 3.12의 Beagle Bone Black 기반 커스텀 보드를 사용하고 있습니다.
초기화 스크립트 중 하나(스크립트가 WiFi를 시작함) 중에 시스템이 중단되었습니다.
이 중단은 임의의 횟수만큼 전원을 껐다 켠 후에 발생했습니다.

Nothing works during this hang, it looks like system is frozen, It doesn't even respond to sysrq keys

나는 이것이 효과가 없기 때문에 ISR 코드에 있다고 생각합니다.

안타깝게도 DETECT_HUNG_TASK"보류 중인 작업 감지( )"를 활성화하면 문제가 표시되지 않습니다. :(

작동하는 유일한 방법은 워치독 타이머가 만료된 후 워치독을 활성화하면 시스템이 재부팅되고 시스템이 복원된다는 것입니다.

하지만 우리는 문제가 무엇인지 알고 싶습니다.

어떤 제안이 있으십니까?

일부 메시지를 인쇄하기 위해 소프트도그 및 수정 스크립트 쌍을 사용하려고 생각했지만 외부 인터럽트의 우선순위가 더 높을 것이고 그것이 실행되고 거기에서 정지되는 동안 소프트도그 타이머도 실행할 기회가 없을 것이라고 생각했습니다. 그렇죠?

버그의 무작위성으로 인해 디버깅이 더 어려워집니다. :(

도움을 주시면 감사하겠습니다.

답변1

글쎄, 우리는 주석에 제안된 대로 코드를 읽었고 시스템이 무한 루프(irq에서)에 들어가 종료할 수 없는 패치 부분을 발견했습니다.

그러나 printk를 irq 함수에 넣으면 문제가 다시 발생하지 않았습니다. (시간문제인거 아시죠?)

마지막으로 내 동료는 GPIO를 전환하는 구식 방법을 시도했는데 도움이 되었습니다. 두 개 이상의 GPIO 토글 항목을 사용하면 문제가 재현되지 않기 때문에 이 역시 어렵습니다.

함수 내부에서는 아래와 같이 GPIO 스위칭을 사용합니다.

func()
{  
   //set gpio high
     some doubtfull code..
     ....
   //set gpio low
}  

이것이 그가 문제가 있는 코드를 추적한 방법이며, 해결책은 linux-4.1에서 제공되었으며, 이를 수정하고 테스트 중입니다.

@ShankarSM: 이 글을 읽고 계신다면 이 글을 추적한 데 대한 모든 공로가 귀하에게 있습니다 :-)

관련 정보