2012-12-07 2 views
-1

gdb를 처음 사용했습니다. c 프로그램을 실행하는 동안 실제 시퀀스와 함께 사용 된 메모리 주소를 인쇄하고 싶습니다. 내 질문에 대해 예를 들어 설명해 보겠습니다. main()과 test()라는 두 개의 함수를 가진 다음의 C 코드를 가지고 있다고 가정 해보자. 나는 gdb 내부에서 main() 함수를 분해하기 위해 "main main"을 사용하거나 test() 함수를 별도로 분해하기 위해 "test disassemble"을 사용할 수 있음을 알고있다. 내 질문은 어떻게이 두 함수를 하나의 코드로 분해 할 수 있는가이다. 그래서 나는 실행 중에 사용 된 모든 메모리 주소와 그것들의 접근 순서를 볼 수있다. 구체적으로 말하면, main()이 test()를 호출하고 test()가 여러 번 호출하는 것처럼, 나는 예제 2와 같은 것을보고 싶다. 나는 또한 방황하고있다. gdb 디스어셈블러에 표시된 주소는 가상 또는 물리적이다. 메모리 주소? 어떤 도움이나 지침도 환영 할 것입니다.GDB에서 메모리 액세스 인쇄

예 1 :

#include "stdio.h" 

int test(int q) 
{ 
    if(q<16) 
    test(q+5); 

    return q; 
} 

void main() 
{ 
    unsigned int a=5; 
    unsigned int b=5; 
    unsigned int c=5; 

    test(a); 
} 

예 2 :

<Memory Address> <assembly instruction> <c instructions> 

0x12546a mov //for unsigned int a=5; 
0x12546b mov //for unsigned int b=5; 
0x12546c mov //for unsigned int c=5;  
0x12546d jmp //for test(q=a=5); 
0x12546e cmpl //for if(q<16) 
0x12546f jmp //for test(q+5); 
0x12546d jmp //for test(q=10); 
0x12546e cmpl //for if(q<16) 
0x12546f jmp //for test(q+5); 
0x12547a jmp //for test(q=15); 
0x12547b cmpl //for if(q<16) 
0x12547c jmp //for test(q+5); 
0x12547d jmp //for test(q=20); 
0x12547e cmpl //for if(q<16) 
0x12547f jmp //return q); 
0x12548a jmp //return q); 
0x12548b jmp //return q); 
0x12548c jmp //return q); 

답변

0

정말이 작업을 수행 할 꽤있는 방법은 없습니다. 당신은 코드를 단계별로해야 할거야 :

(gdb) stepi 
(gdb) x/i $pc 
(gdb) info registers 
(gdb) stepi 
(gdb) x/i $pc 
(gdb) info registers 
..... 

당신 수 최대 있도록이 신속하게 수행하고 데이터를 파일로 덤프하지만 모든 약의 스크립트.

0

나는 valgrind와 더 운이 좋을지도 모른다. 그렇게 할 수있는 기존 도구가 없다면 메모리 액세스를보고하기위한 도구를 추가하거나 기존 도구를 변경하는 것이 가능합니다.

예. http://valgrind.org/docs/manual/lk-manual.html

--trace-MEM = 기본 : 아니오] 보지

활성화

는 하인 프로그램에 의해 거의 모든 메모리 액세스의 사이즈 및 어드레스를 출력한다.

관련 문제