메모리 주소값 알아오는 방법 질문입니다...

zippiest의 이미지

C에서 작성한 프로그램의 변수나 함수의 메모리 주소를 알아오는 방법을 알고 싶습니다..

예를들어

#include

int main()
{

int s=5;
printf("%d"s);

return 0;

}

이런 프로그램을 작성하고 실행했을때

여기에 s 라는 변수가 올라가 있는 메모리의 주소값을 알고 싶습니다..

물론 VC 같은 툴로 디버깅 해보면 알 수 있겠지만...

메모리 주소값을 읽어올 수 있는 프로그래밍 방법을 알고 싶습니다...

지금 간단한 디버거를 만들려고 생각중이라서요.....

부탁 드립니다...

swiri15의 이미지

주소연산자 &와 메모리번지 포맷 %p를 이용하시면 됩니다

간단한 예입니다.

int k;

printf("address of local variable k : %p\n", &k);

zippiest의 이미지

네 답변감사합니다...
제가 질문에 중요한 사항을 빼먹었군요....
제가 알고 싶은것은.. 소스를 컴파일한 실행파일을 실행해 실행중인 파일.. 소스를 모르는 상태에서...
각 변수들이 저장된 메모리의 스택주소를 추출하는 방법을 질문한것이었습니다~~
아무튼 감사해요...

bootmeta의 이미지

일단 소스 파일내의 변수나 관련 디버깅 정보등은 컴파일러 마다 다르게 구현합니다.
(컴파일러가 아니라 플랫폼 표준 형태로 구현된 경우가 있을 수도 있습니다.)
최소한 gcc와 vc, bolanc c 등의 구현이나 스펙이 제각각이라 현재 사용하는 컴파일러와 디버거 관련 문서를 참고하셔야 할 듯합니다.
일반적인 관점에서 이야기하기에는 구현이 전부 다르기 때문에 쉽게 답할 수 없는 문제입니다.

chadr의 이미지

디버깅 심볼이 없는 상태에서 알아내기는 힘듭니다..
소스에 보이는 변수 이름은 단순히 사람이 보기 편한 인식자이므로
컴파일후 실행파일에 디버깅 심볼이 들어가있지 않으면 알수가 없습니다.

디버거도 이 디버깅심볼을 이용하여 추적을 하니까요..
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

zippiest의 이미지

아... 죄송하지만 또 질문 드릴께요..ㅋㅋ

리눅스 실행포맷인 ELF 파일에서 물론 디버깅정보가 추가된 ELF 파일입니다...

이 ELF 파일을 보면 .debug_info 라는 섹션에 각 디버깅 심볼이 저장되어 있는걸 확인했거든요...

그런데 만약 .debug_info에 어떤 함수심볼이 저장되어 있다면 이 함수가 call 되기전 return 주소도

.debug_info 섹션에 저장되어 있나요??