커널 printk 링 버퍼 오버플로를 방지하는 방법은 무엇입니까?

커널 printk 링 버퍼 오버플로를 방지하는 방법은 무엇입니까?

Linux 드라이버를 디버깅하려고 하는데 특정 코드 부분이 매우 이상하게 동작합니다. 무슨 일이 일어나고 있는지 이해하기 위해 코드가 실행되는 동안 내가 관심 있는 변수가 무엇인지 정확히 볼 수 있도록 코드를 printk 문으로 채웠습니다. 불행하게도 라인 수가 많은 링 버퍼를 인쇄할 때 dmesg무작위로 손실되는 것 같습니다. Google은 링 버퍼에 한 번에 너무 많은 데이터를 쓰고 있기 때문에 이것이라고 말했습니다. 링 버퍼 크기를 최대(1 << 21)로 늘리고 쓰기 속도를 늦추기 위해 udelay를 삽입해 보았지만 여전히 같은 문제가 있습니다.

또 무엇을 시도할 수 있나요?

답변1

내가 아는 한, 읽기에 klogd차단을 사용하면 renice를 통해 우선순위를 높이면 도움이 될 수 있습니다. 또는 옵션을 사용하여 파일에 직접 작성하여 일부 디스크 오버헤드를 절약하기 위해 ramfs/tmpfs에 커널 로그를 작성할 수도 있습니다 .read()/proc/kmsgsyslogklogd-f

그렇지 않으면 플랜 B는그리고 trace_printk():http://lwn.net/Articles/365835/

관련 정보