2014-02-17 6 views
3

strace을 사용하여 이진 프로그램이 메모리를 사용하는 방법을 이해하려고합니다.strace는 문자열 값의 값 대신에 주소를 출력하는 방법은 무엇입니까?

그러나 기본 출력 인 strace은 사용자 편의를 위해 각각 char * 버퍼를 해당 문자열로 인쇄합니다.

read(3, "Tell me, Muse, of that man of ma"..., 4096) = 270 

다음 그 내용에 문자열의 실제 주소를 인쇄 할 strace을 알 수있는 방법이 있습니까?

양쪽 모두 가질 수없는 경우 잘린 내용 대신 문자열의 주소 만 인쇄해도 괜찮습니다.

+0

나는 strace (1)이 사용되는 방법이라고 생각하지 않습니다. 대신 ltrace와 gdb를 살펴볼 수도 있습니다. –

+0

어쩌면 지원되지 않을 수도 있지만, 설명하는 내용이 strace의 범위를 벗어나는 것입니다. 이미 작업을 수행하지만 필요한 형식으로 정보를 인쇄하지 않습니다. 나는 이미 ltrace를 검사했으며 동일한 동작을합니다 (즉, char * 버퍼가 문자열로 인쇄 됨). gdb는 내가 원한 것이 아닌 대화식 디버깅을위한 것입니다. – m000

답변

2

the source of strace을 다운로드하고 모두 tprintf("%s", ...)tprintf("%p", ...)으로 수정하고 strace 로컬 복사본을 만들 수 있습니다.

+0

소스 수정은 옵션입니다. 나는 이것을 조사하고 있지만 보이는 것보다 조금 더 까다 롭습니다. – m000

+0

이 문제에 대한 귀하의 솔루션 공유를 기대하십시오. –

+0

목적을 위해이 패치를 만들었습니다 : https://gist.github.com/m000/9240954 이 동작을 켜거나 끄기 위해 명령 줄 스위치를 추가하는 것이 매우 쉽습니다. 그러나 strace 관리자가 이것을 트렁크에 합치는데 관심이 없다면 문제가되지 않을 것입니다. – m000

11

-e raw = read는 이미 원하는 것을해야합니다. 소스 수정이 필요 없습니다.

브로드 @ creepspread ~ 원시 = 2> & 1 LS 읽어 %의 strace를 -e | 그렙 ^는
리드 (0x3으로, 0x7fff5ea52e78, 0x340) = 읽기 (0x3으로, 0x7fff5ea52e48, 0x340)를 0x340
를 = 0x340
읽기 리드 (0x3으로, 0x7fff5ea52e18, 0x340)를 0x340
리드 (0x3으로, 0x7fff5ea52de8, 0x340) 0x340
읽기 (0x3으로는 0x7fff5ea52ca8는 0x340)를 0x340
판독 = (은 0x3을 0x7fff5ea52c48, 0x340) 0x340
판독 =를 = (0x3, 0x7fff5ea52c18, 0x340) = 0x340
r ead (0x3, 0x7fef1433f000, 0x400) = 0x136
read (0x3, 0x7fef1433f000, 0x400) = 0

+0

잘 알고 있습니다. 그래도 디버깅 할 때 무엇이 ​​어디서 있는지를 아는 것이 유용합니다. 기본적으로 strace는 작성된 것을 보여줍니다. 이 옵션을 사용하면 작성된 위치 만 표시됩니다. 이 패치로 수정 한 내용은 다음과 같이 표시됩니다 : read (3, 0x9118000 : "strace, 시스템 콜 tr"..., 32768) = 592 – m000

+2

-e raw = read -e read = 모두는 모두 디코딩되지 않은 것을 보여줍니다. 읽기 시스템 호출을위한 데이터뿐만 아니라 읽은 내용의 16 진 덤프. -e read에 대한 인수는 파일 설명자 목록이므로 필터를 그 방법으로 필터링 할 수 있습니다. –

+0

-e write는 btw와 같은 방식으로 작동하지만 쓰기에는 사용됩니다. –