디버깅 목적으로 주소를 기호에 매핑하는 데 어려움을 겪고 있습니다 (콜 스택 가져 오기). MS dbghelp.dll은 주소에서 기호를 알 수 있습니다 (SymFromAddr
, MSDN 참조). 그러나, 그것은 작동하지 않고 주소가 프로그램의 모든 실행으로 변경하는 것 때문에 나는이 이제까지 일할 수있는 방법을 궁금해 :함수가 실행될 때마다 주소가 변경되는 이유는 무엇입니까?
#include <iostream>
void Foo() {}
int _tmain(int argc, _TCHAR* argv[])
{
const long unsigned int addr = reinterpret_cast<long unsigned int>(&Foo);
std::cout << "Address: " << std::hex << addr << std::endl;
return 0;
}
출력 :
D:\dev\Sandbox\Debug>Sandbox.exe
Address: 901320
D:\dev\Sandbox\Debug>Sandbox.exe
Address: ce1320
D:\dev\Sandbox\Debug>Sandbox.exe
Address: 3a1320
D:\dev\Sandbox\Debug>Sandbox.exe
Address: 3f1320
어떻게 할 수있는 다른 프로그램 이제까지 stacktrace 에서처럼 주소를 읽고 함수에 매핑 하시겠습니까? 이것은 나에게 마술처럼 들린다. 나는 링크 된 문서에서 주소에서 무엇인가를 뺄 필요가 있다고 말한 것을 찾지 못했습니다.
리얼 모드를 극복 한 이후 모든 프로세스에는 가상 메모리 공간이 있으므로 어쨌든로드 주소에 대해 주사위를 굴릴 필요가 없습니다. DLL의 경우 절대 주소의 불확실성을 이해할 수 있지만 주 실행 파일은 이해할 수 없습니다.
VS2008로 Win7에서 시도했습니다.
이 무작위 화에 대한 여러 답변, 감사합니다! 나는 WTF와 같았다! !!! 어떻게이 슈퍼 MS "무명을 통한 보안"과 함께 스택 덤프가 유용할까요?! – Borph
모든 디버거는 임의의 오프셋으로로드 된 모듈을 처리 할 수 있기 때문에. DLL은 항상 움직입니다. – MSalters