2011-02-06 3 views
0

symgetlinefromaddr64를 사용하여 stackwalk에서 수집 한 주소의 줄 번호를 얻으려고하고 있지만 간단한 명령이나 해당 줄의 주소를 가져올 수 없습니다. 예를 들어
, 나는이 방법을 찾고 있어요 경우 :디버거는 어떻게 명령 줄 번호를 얻습니까?

void Test(int g) 
{ 
    g++; 
    DoSomething(g); 
    g--; 
} 

나는 "해봐요"의 줄 번호를 얻을 수 있습니다,하지만 난 그것을 가정 등 "g ++" 의 줄 번호를 원하는 디버거가 그렇게하기 때문에 할 수 있습니다. Windows에서 C++로 직접 어떻게 할 수 있습니까?

+1

릴리스 빌드 코드 용입니까? 예, 해당 라인은 코드를 생성하지 않으며 함수 본문은 DoSomething (g + 1)으로 변환됩니다. –

+0

아니요, 그냥 디버그 빌드 ... –

답변

0

스택 워크는 스택에 저장된 주소 만 검색합니다. 이는 함수 호출을 의미합니다. g++ 또는 g--의 주소를 원할 경우 스택 워크가 아닌 다른 것을 사용해야합니다 (예 : SymGetFileLineOffsets64). 스택 워크에서 시작하여 SymGetLineFromAddr64에 대한 정보가있는 경우 SymGetLineNext64SymGetLinePrev64을 사용하여 주변 선에 대한 정보를 얻을 수 있습니다.

+0

같은? EIP가 도움을주는 주소를 얻게 될까요? –

+0

@la la lu : 일부 가능성에 대한 참조를 추가 할 목적으로 편집되었습니다. –

+0

하지만이 함수가 줄 번호의 주소를 제공한다는 것을 이해하는 한. 나는 다른 방향으로 가고 싶다. –

0

유일한 방법은 Visual Studio 컴파일러 용으로 *.pdb 파일과 같은 컴파일러 생성 기호 파일을 사용하는 것입니다 (pdb는 프로그램 데이터베이스를 의미 함). 이 파일에는 컴파일 단계에서 사용 된 모든 기호가 들어 있습니다. 릴리즈 컴파일의 경우에도 사용중인 심볼에 대한 정보를 얻을 수 있습니다 (일부는 최적화 된 상태 일 수 있음).

가장 큰 단점은 컴파일러에 따라 다르다는 것입니다. 예를 들어 gcc는 실행 파일 so-file 또는 실행 파일에 기호 정보를 포함 할 수 있습니다. 다른 컴파일러는 다른 형식을 가지고 있습니다 ...

어떤 컴파일러를 사용합니까 (이름/버전)?

+0

Vs2008을 사용하고 있습니다. –

+0

그런 다음 디버거가 수행하는 pdbs를 사용해보십시오. 아니오 pdb : 소스 레벨 디버깅, 불일치 pdb : 디버깅중인 프로그램의 현재 상태와 강조 표시된 라인이 일치하지 않습니다. Pdbs에는 확실히 필요한 정보가 들어 있습니다. 그러나 그것은 공개 형식이 아닙니다. http://msdn.microsoft.com/en-us/library/yd4f8bd1(v=VS.90).aspx – jdehaan