2017-03-25 3 views
0

필자가 작성한 예쁜 프린터의 경우 컨테이너에서 사용되는 정렬 또는 유형을 알고 싶습니다. 불행히도 alignof() 또는 유사한 "표준"연산자를 사용하면 작동하지 않습니다 (https://sourceware.org/bugzilla/show_bug.cgi?id=17095). 또한 작동하지 않는 소스 코드에서 직접 작업 "전형적인"매크로 트릭을 사용 : GDB의 Python API에서 (또는 GDB에서 직접) 타입 정렬을 얻을 수있는 방법이 있습니까?

p ((char *)(&((struct { char c; double _h; } *)0)->_h) - (char *)0) 
A syntax error in expression, near `{ char c; double _h; } *)0)->_h) - (char *)0)'. 

은 모든 것을 가능, 또는 어쩌면 유일한 방법은 그 내부 GDB에서 지원하는 것입니다?

답변

1

현재이 정보를 얻을 방법이 없습니다. 왜냐하면 현재 gdb에는 정보가 없기 때문입니다.

DWARF 버전 5 이전에는 디버그 정보에서 정렬을 표현하는 표준 방법이 없었습니다. DWARF 5는 DW_AT_alignment을 추가했지만 gdb는이 속성을 무시합니다. 이를 Python API를 통해 노출 시키려면이를 읽고 gdb의 내부 struct type에 저장해야합니다. 나는 컴파일러가 아직이 속성을 방출하는지 여부를 알지 못한다.

gdb compile 기능을 사용하거나 컴파일러를 직접 실행하고 추출 할 수있는 방식으로 정렬을 내 보내야한다면 필사적이었습니다.

그러나 일반적으로 정렬은 관련 유형 크기에서 계산하기가 너무 어렵지 않으며 대상 아키텍처가 상대적으로 제한적인 경우 자신의 정렬 컴퓨터를 롤업하는 것이 더 간단 할 것입니다.

+0

"정렬은 관련 유형 크기에서 계산하기가 너무 어렵지 않습니다"라는 말은 크기를 가져 와서 아키텍처의 최대 정렬보다 크지 않은 다음의 거듭 제곱을 계산하는 것입니다. 이것은 수동으로 정렬되지 않았고 배열과 구조체에 대해 실패하는 유형에서만 작동합니다 ... 그래서 나는 당신이 그보다 더 복잡한 것을 생각하고 있다고 생각합니다. –

+0

정렬이 명시 적으로 설정된 유형이 걱정된다면 컴파일러를 어떻게 든 실행하거나 gdb를 수정하는 것 외에는 할 수있는 일이 없습니다. 보다 일반적인 경우에는 플랫폼에 맞는 일반적인 레이아웃 규칙을 구현하면됩니다. –