저는 두 가지 다른 방법을 사용하여 Linux USB 드라이버가 어떻게 작동하는지 분석해 왔습니다.
- 출력을 확인하십시오
usbmon
. 이는 "온라인"으로 전송되는 내용에 대한 16진수 덤프 보기입니다. - 커널 드라이버 모듈 소스에 명령문을 추가
printk()
하고 이를 커널에 다시 로드합니다.
cat /sys/kernel/debug/usb/usbmon/1u
각각 및 를 통해 이러한 메서드의 출력을 얻을 수 있습니다 cat /var/log/kern.log
.
지금 내가 원하는 것은 두 파일을 실시간으로 병합하여 printk()
네트워크를 통해 전송되는 16진수 라인과 인터리브된 커널 드라이버에 삽입한 로그 메시지를 볼 수 있는 것입니다. 예를 들어 USB 데이터를 보내는 것으로 알고 있는 드라이버 코드의 시작과 끝 부분에 명령문을 넣을 수 있으며 16진수( 예: 다음에서 보낸 데이터)를 printk()
볼 수 있습니다.usbmon
입력 함수 sendImportantUSBData() // 드라이버 코드에서 printk()
0a ff bbbb ac 0993 b3332 // usbmon 로그에서
함수 종료 sendImportantUSBData() // 드라이버 코드에서 printk()
tail
단일 파일의 마지막 몇 줄을 표시하는 것이 가능하다는 것을 알고 있습니다 . 또한 타이밍 민감도와 병합된 행 순서의 정확성에 미치는 영향에 대한 관련 세부 정보를 본 적이 없지만 n
도구가 일부 병합을 수행할 수 있다는 것도 알고 있습니다 . 시간에 민감한 로그를 정확하게 병합하거나 병합을 위해 비교적 짧은 시간 간격을 지정할 수 있도록 해주는 multitail
적합한 도구가 있습니까 ? 후자의 경우, 드라이버 가 .a)
b)
printk()
usbmon
답변1
어때요 tail -F /sys/kernel/debug/usb/usbmon/1u /var/log/kern.log
? 이렇게 하면 두 파일의 출력을 "추적"하고 각 파일의 출력을 표시할 때 짧은 헤더를 인쇄합니다.
답변2
프로그래밍을 많이 하고 싶지 않다면 너무 쉽습니다.
log1
과 을 혼합한다고 가정하면 log2
결과는 다음과 같습니다 log
.
백그라운드에서 log1을 모니터링하고 로그에 변경 사항을 추가합니다.tail -f log1 >> log &
log2에서 다른 프로세스 모니터링 시작tail -f log2 >> log &
그것을 증명하려면 시도해보십시오.
echo ok1 >> log1; echo ok2 >> log2
이제 확인하면 log
얻을 수 있습니다.
확인 1
확인 2
답변3
비록 이 예를 찾고 있었지만.. 다른 목적으로 사용해 보았는데 결과에 만족했습니다. 출력을 다음과 같은 파일로 리디렉션했습니다.꼬리 -F /sys/kernel/debug/usb/usbmon/1u /var/log/kern.log >> tail.output 초당 3번씩 서로 다른 두 라이브 로그의 병합된 출력을 얻습니다. 지피님 정말 감사합니다 :-)