내 목표는 :
- Delphi로 컴파일 된 32 비트 또는 64 비트 Windows 프로그램에 일시 중단 된 스레드가 주어지면 스택을 살펴볼 수 있습니다 (실행 가능).
- 스택 항목이 주어지면 각 메서드와 해당 값의 지역 변수를 열거합니다. 즉, 적어도 주소와 유형 (integer32 / 64 / signed / unsigned, string, float, record, class …)을 찾아 값을 찾는 데 사용할 수 있습니다.
첫 번째는 괜찮고이 질문에 관한 두 번째 문제입니다. 높은 수준 에서 Delphi의 스택 항목이 주어지면 지역 변수를 어떻게 열거합니까?
낮은 수준에서 이것은 내가 조사한 것입니다.
RTTI : 메서드에 대한 이러한 종류의 정보를 나열하지 않습니다. 이것은 내가 실제로 현실적인 선택이라고 생각한 것이 아니었지만 어쨌든 여기에 나열했습니다.
디버그 정보 : 디버그 빌드를 위해 생성 된 디버그 정보를로드합니다.
- 지도 파일 : 상세한지도 파일 (텍스트 형식 파일! 하나를 열고 살펴보기)에도 지역 변수 정보가 포함되어 있지 않습니다. 기본적으로 주소 및 소스 파일 행 번호 목록입니다. 파일 및 라인 상관 관계에 대한 주소 (예 : 거터의 파란색 점)에 적합합니다. 더 자세한 정보에 적합하지 않음
- 원격 디버깅 정보 (RSM 파일)- 내용이나 형식에 대한 알려진 정보가 없습니다 .
- TD32 / TDS 파일 : 나의 현재 연구 라인. 여기에는 다른 많은 정보 중에서 전역 및 지역 기호가 포함되어 있습니다.
여기에서 발생하는 문제는 다음과 같습니다.
- TD32 파일 형식에 대한 문서가 없습니다 (찾을 수 있음).
- 그들에 대한 대부분의 지식은 그들을 사용하는 Jedi JCL 코드 (JclTD32.pas)에서 비롯되었으며 해당 코드를 사용하는 방법 또는 구조가 지역 변수를 표시하기에 충분히 광범위한 지 확실하지 않습니다. 나는 그것이 전역 기호를 처리 할 것이라고 확신하지만 지역에 대해서는 매우 불확실합니다. 정의 된 다양한 상수가 있고 형식에 대한 문서가 없는데, 그 의미를 읽기 위해 추측 할 수 있습니다. 그러나 이러한 상수와 이름은 어딘가에서 왔어 야합니다.
- TDS 정보를 사용하여 찾을 수있는 소스 는 로컬 기호를로드하거나 처리하지 않습니다.
이것이 올바른 접근 방식이라면이 질문은 ‘TDS / TD32 파일 형식에 대한 문서가 있고 지역 변수를로드하는 코드 샘플이 있습니까?’가됩니다.
코드 샘플은 필수는 아니지만 매우 작더라도 매우 유용 할 수 있습니다.
답변
바이너리가 아닌 디버깅 기호가 있는지 확인하십시오. GDB를 사용하는 것도 가능합니다 (Windows에서는 포트). .dbg 또는 .dSYM 파일을 찾으면 좋을 것입니다. 예를 들어 소스 코드가 포함되어 있습니다.
gdb> list foo
56 void foo()
57 {
58 bar();
59 sighandler_t fnc = signal(SIGHUP, SIG_IGN);
60 raise(SIGHUP);
61 signal(SIGHUP, fnc);
62 baz(fnc);
63 }
디버깅 파일이없는 경우 MinGW 또는 Cygwin을 가져 와서 nm (1) ( man page )를 사용할 수 있습니다. 바이너리에서 기호 이름을 읽습니다. 여기에는 C ++ 유형과 같은 일부 유형이 포함될 수 있습니다.
int abc::def::Ghi::jkl(const std::string, int, const void*)
--demangle
옵션 을 추가하는 것을 잊지 마십시오. 그렇지 않으면 다음과 같은 메시지가 표시됩니다.
__ZN11MRasterFont21getRasterForCharacterEh
대신에:
MRasterFont::getRasterForCharacter(unsigned char)
답변
http://download.xskernel.org/docs/file%20formats/omf/borland.txt 개방형 아키텍처 핸드북을 살펴보십시오 . 오래되었지만 파일 형식에 대한 관련 정보를 찾을 수 있습니다.