혹시 임의의 어플리케이션을 수행할 시에 수행되는 특정 어셈 명령어의 개수를 알 수 있을까요?
글쓴이: 강동우 / 작성시간: 월, 2010/06/28 - 6:56오전
예를 들어 보자면...
test.c 라는 파일을 컴파일 해서 a.out 이라는 실행 파일이 만들어 지고
이 녀석을 실행 시킬 시 loop 라든가 함수 등을 왔다 갔다 하면서, mov 명령어 들이 수행이 된다면
mov 명령어의 수행 카운트를 구하고 싶습니다.
gdb를 이용해 보려고 하는데 영 감이 안잡히네요.
가장 좋은 방법은 사실 수행되는 어셈 명령어를 전부 출력하는 것이긴 합니다만... 마땅히 좋은 방법이 떠오르지가 않네요..
자그마한 힌트라도 얻을 수 있을까요
Forums:
objdump -S 오브젝트파일
위와 같이 컴파일 하시면, 오브젝트파일 test.o 가 튀어나오죠?
그걸
로 디스어셈블 하시면 소스코드와 그에 대응되는 인스트럭션이 보입니다.
--------------
save the earth
생산적인 댓글을 달자
죄송합니다. 질문을 잘못 이해했습니다.
objdump -S 는 정적으로 함수내부를 디스어셈블 할 뿐이지, 런타임에 특정 명령어가 몇 번 실행되었는지를 알려주진 않습니다.
실행중에 알고싶으시다면, 역시 gdb를 쓰는게 좋을 듯 하네요.
gdb 실행후,
하시면 특정함수의 인스트럭션이 보이죠.
그리고 나서 확인하고 싶은 인스트럭션이 존재하는 어드레스에 브레이크포인트를 설정합니다.
브레이크포인트에 몇 번 도착했는지를 구하면 되겠죠?
일단 위에서 지정한 브레이크포인트의 번호를 확인해 둡니다.
그리고, 브레이크포인트 도착 확인용 변수를 하나 선언합니다.
위에서 지정된 브레이크포인트에 도착했을때, $callnum을 하나 증가시키고나서 자동으로 실행을 재개시키기 위해 브레이크포인트 커맨드를 설정합니다.
프로그램 실행후,
하시면 답이 나오겠죠?
--------------
save the earth
생산적인 댓글을 달자
ptrace 사용해보세요
아래 시리즈물(?) 중에 비슷한 예제가 있었던 것으로 기억합니다.
http://linuxgazette.net/issue81/sandeep.html
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
Debug register를 확인해 보면 가능할지도 모릅니다만..
일부 CPU중에 디버그 레지스터를 이용하면 가능한 것들도 있습니다.
주소를 해당 APP이 떠있는 주소로 마스크하고, 코드 값을 마스킹해 놓아서, 동일한게 걸리면 정지해서 카운트를 증가 시킨후, 다시 실행하도록 하는 방식으로요..
문제는 X86이나 AMD64에서 명령어(PC가 가르키는 값)에 대해 Break를 할 수 있는 기능이 지원되냐 인데..
(주소는 보통 다 지원을 합니다 GDB등에서도 이용하죠)
될 수도 있을 것 같습니다. 확인해보세요.
만약 이게 지원되지 않는다면...
해당 명령어를 다른 값(쓰레기 값)으로 치환해서 익셉션을 일으키는 복잡한 방법을 사용해야 합니다.
댓글 달기