혹시 임의의 어플리케이션을 수행할 시에 수행되는 특정 어셈 명령어의 개수를 알 수 있을까요?

강동우의 이미지

예를 들어 보자면...

test.c 라는 파일을 컴파일 해서 a.out 이라는 실행 파일이 만들어 지고

이 녀석을 실행 시킬 시 loop 라든가 함수 등을 왔다 갔다 하면서, mov 명령어 들이 수행이 된다면

mov 명령어의 수행 카운트를 구하고 싶습니다.

gdb를 이용해 보려고 하는데 영 감이 안잡히네요.

가장 좋은 방법은 사실 수행되는 어셈 명령어를 전부 출력하는 것이긴 합니다만... 마땅히 좋은 방법이 떠오르지가 않네요..

자그마한 힌트라도 얻을 수 있을까요

sohn9086의 이미지

gcc -g -c test.c

위와 같이 컴파일 하시면, 오브젝트파일 test.o 가 튀어나오죠?
그걸
objdump -S test.o

로 디스어셈블 하시면 소스코드와 그에 대응되는 인스트럭션이 보입니다.

--------------
save the earth

생산적인 댓글을 달자

sohn9086의 이미지

objdump -S 는 정적으로 함수내부를 디스어셈블 할 뿐이지, 런타임에 특정 명령어가 몇 번 실행되었는지를 알려주진 않습니다.

실행중에 알고싶으시다면, 역시 gdb를 쓰는게 좋을 듯 하네요.

gdb 실행후,

disas 함수명

하시면 특정함수의 인스트럭션이 보이죠.

그리고 나서 확인하고 싶은 인스트럭션이 존재하는 어드레스에 브레이크포인트를 설정합니다.

예)
b *0x0808xxxx

브레이크포인트에 몇 번 도착했는지를 구하면 되겠죠?
일단 위에서 지정한 브레이크포인트의 번호를 확인해 둡니다.
그리고, 브레이크포인트 도착 확인용 변수를 하나 선언합니다.

set variable $callnum = 0

위에서 지정된 브레이크포인트에 도착했을때, $callnum을 하나 증가시키고나서 자동으로 실행을 재개시키기 위해 브레이크포인트 커맨드를 설정합니다.

commands 브레이크포인트번호
set variable $callnum = $callnum + 1
c
end

프로그램 실행후,

p $callnum

하시면 답이 나오겠죠?

--------------
save the earth

생산적인 댓글을 달자

M.W.Park의 이미지

아래 시리즈물(?) 중에 비슷한 예제가 있었던 것으로 기억합니다.

http://linuxgazette.net/issue81/sandeep.html

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

mac040의 이미지

일부 CPU중에 디버그 레지스터를 이용하면 가능한 것들도 있습니다.

주소를 해당 APP이 떠있는 주소로 마스크하고, 코드 값을 마스킹해 놓아서, 동일한게 걸리면 정지해서 카운트를 증가 시킨후, 다시 실행하도록 하는 방식으로요..

문제는 X86이나 AMD64에서 명령어(PC가 가르키는 값)에 대해 Break를 할 수 있는 기능이 지원되냐 인데..
(주소는 보통 다 지원을 합니다 GDB등에서도 이용하죠)

될 수도 있을 것 같습니다. 확인해보세요.

만약 이게 지원되지 않는다면...

해당 명령어를 다른 값(쓰레기 값)으로 치환해서 익셉션을 일으키는 복잡한 방법을 사용해야 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.