요청하신 정보는 컴파일러가 생성 한 객체 코드의 정상적인 부분이 아니며 일반적으로 객체 코드 또는 일반 심볼 테이블을 검사하여 완전히 얻을 수 없습니다. 이 정보의 대부분은 목적 코드의 목적이 단순히 프로그램을 실행하는 것이 가능하기 때문에 목적 코드에 유지되지 않습니다. 오브젝트 코드의 원점에 관한 정보 (소스 코드를 작성한 소스 행이나 소스에 사용 된 이름 등)는 실행에 간단하게 불필요합니다.
요청한 정보 중 상당수는 GCC 로의 -g
스위치와 마찬가지로 컴파일러가 요청할 때 생성되는 디버깅 정보로 제공됩니다. 이 디버깅 정보는 컴파일러에 따라 다양한 형식으로 만들어집니다. 이 정보를 직접 또는 다양한 도구를 사용하여 검사 할 수도 있지만 그렇게하는 방법은 컴파일러 및 사용중인 다른 도구에 따라 다릅니다. 유용하게 사용하려면 디버깅 정보 형식에 대한 많은 연구가 필요합니다.
많은 디버깅 정보는 gdb
과 같은 디버거를 사용하여 검사 할 수 있습니다. 디버거는 일반적으로 특정 소스 코드 행과 관련된 지침을 검사하거나 객체에 할당 된 메모리를 찾는 도구를 제공합니다.
그러나 소스 코드에서 실행중인 프로그램의 지침이나 데이터까지의 맵은 매우 복잡 할 수 있습니다. 최적화 프로그램이 불필요하다고 추론했기 때문에 소스 코드의 일부 라인이 완전히 사라 졌을 수 있습니다. 간단한 예를 들어, 고려 :
b = a;
c = b;
d = c;
내가 c = b;
어느 곳에 나 프로그램 명령이 없다고 예상; 나는 컴파일러가 끼어들 수있는 단계없이 d
으로 직접 a
을 옮기고 상황에 따라 그 방법을 최적화 할 수도 있다고 기대한다.
또한 변수 중 하나와 같은 개체를 처리하는 동안 컴파일러는 레지스터에 개체가 있고 메모리에 전혀없는 코드를 생성 할 수 있으며 메모리에 개체가있는 경우가 있습니다. 객체가 부분적으로 메모리에 있고 부분적으로 레지스터에있을 수도 있습니다. 예를 들어, 객체가 8 바이트로 구성되어 있고 컴파일러가 일부 작업을 수행하는 데 필요한 레지스터 공간을 모두 소모하는 경우 객체의 4 바이트를 스택에 저장하고 새로 사용 가능한 레지스터를 잠시 사용하고 스택.)
코드 줄에는 편집기가 제외하고 주소가 없습니다. 하지만 에뮬레이터에서 코드를 실행하고 모든 명령을 수행 한 후에 검사 할 수 있습니다 (느려지 겠지만). –
어떤 OS입니까? C에서 모든 변수가 주소를 가지고있는 것은 아니며 (레지스터에 선언 된 것들, 레지스터에 엔트리 된 것들, 존재하지 않는 것들에 최적화되어있는 것들)주의하십시오. – Jens
"코드 줄에는 주소가 없습니다"- 어떤 사람들은 컴퓨터 또는 툴체인의 작동 방식에 대해 많이 알지 못하는 것 같습니다. http://en.wikipedia.org/wiki/DWARF : "코드 위치와 소스 코드 위치를 매핑하는 라인 번호 테이블"을 참조하십시오. –