2017-11-17 18 views
1

리눅스에서 어떤 스레드가 먼저 fd를 받았지만 지금은 행운을 찾지 못했습니다.fd가 열린 스레드 찾기 fd

/proc/pid/task/ 

은 각 스레드에서 사용할 수있는 fd를 보여 주므로 전체 프로세스 공간에서 디스크립터를 사용할 수 있으므로 의미가 있습니다.

lsof 

은 물론이 유스 케이스의 도움이되지 않습니다.

프로그램이 매우 복잡하며 strace 또는 gdb도 도움이되지 않습니다. 사용 된 폐쇄 형 소스 라이브러리가 수없이 많습니다. 파일 경로는 알려져 있지만 libaries의 코드에 액세스 할 수 없기 때문에 도움이되지 않습니다. 필자는 fd 누출이 매우 드물게 발생하는 경쟁 조건으로 인한 것 같으며 파일을 열어 놓은 스레드를 추적해야합니다.

구현하기 쉬운 한 가지 해결책은 커널 파일 열기 핸들러 또는 c 라이브러리에 로그를 추가하는 것이지만, 좋은 이유로 커널을 변경하거나 표준 라이브러리를 변경할 수 없습니다. .

몇 가지 제안 사항이 있습니까?

+0

를? 이 작업을 수행하는 라이브러리의 소스에 액세스 할 수 없으며 라이브러리가 무엇인지 모릅니다. 커널이나 라이브러리를 변경할 수 없습니다. 그게 내 스레드가 아니므로 스레드 ID를 찾아야하는 이유입니다. –

+0

그것은 내 스레드가 아니라 코드를 액세스 할 수없는 라이브러리에서 가져온 것입니다. –

+1

아, 스팸 메일 죄송합니다.) – user463035818

답변

3

당신이 커널 기호를 사용할 수 사용 SystemTap의 경우 : 추가 tobi303 @

sudo stap -e 'probe syscall.open.return { \ printf("tid=%d, fd=%d\n", tid(), $return) }'