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);