gdb 7.11.1 및 gfortran 5.4.0과 함께 Eclipse (Neon.3 릴리스 4.6.3)를 사용하여 실행 파일을 디버깅합니다 로컬 서브 루틴 변수와 간단한 외부 변수를 제대로 볼 수 있습니다.Eclipse에서 gfortran을 디버깅하는 동안 gdb에서 전역 배열/구조체에 액세스 할 수 없음
module ext_class
type extstruct_type
integer(kind=4), ::svar1
integer(kind=4), ::svar2
end type extstruct_type
integer(kind=4), save :: extvar
integer(kind=4), dimension(4), save :: extarray
type (extstruct_type), save :: extstruct
end
module mod
subroutine foo(invar)
use ext_class, only : extvar, extarray, extstruct
type (real::8), intent(in) :: invar
integer(kind=4) :: i
...
!Debugger breakpoint inserted here to check variable visibility
end
end
제대로 (extvar, extarray, extstruct
)를 지역 변수 (i
)하고 모듈/배열을 경우에도 입력 (invar
)하지만, 외부/전역 변수를 표시합니다 이클립스의 변수 목록 돈 '이 간단한 예를 생각해 목록에 나타나지 않습니다. "표현식"보기에 수동으로 입력하려고하면 누락 된 기호를 평가할 수 없다는 오류가 발생합니다.
내가 사용하는 특별한 표기를 발견 디버거 백 엔드에서 * extvar 오류 메시지 - -var 만들 :여러 오류가보고됩니다.
1) MI 명령을 실행하지 못했습니다 : -var 작성 - 디버거 백 엔드에서 * extvar 오류 메시지 : -var 만들 : 변수 개체를 만들 수 없습니다 변수 개체를 만들 수 없습니다
2)
3) MI 명령을 실행하지 못했습니다. -data-evaluate-expression extvar 디버거 백 엔드의 오류 메시지 : 현재 컨텍스트에서 기호 "extvar"가 없습니다. 는 -var 만들 : 변수 개체를 만들 수 없습니다
4) MI 명령을 실행하지 못했습니다
nm <binaryname> | grep <modulename>
내가 다음 일반적으로 입력하여 GDB의 글로벌 모듈 멤버를 볼 수 있습니다 :
컴파일러 명령을 사용하여 바이너리 실행 파일에 이러한 글로벌 변수를 저장하는print __<modulename>_MOD_<membername>
그러나 모듈의 간단한 멤버 유형 인 경우에만! 예를 들어 I 적절히 정수 부재 볼 수
: 정수 정적 어레이print __ext_class_MOD_extvar
$1 = 0
를 그것이 잘못 만하므로 부재 어레이의 다른 구성 요소 중 하나를 볼 나를 방지 첫번째 요소를 인쇄
: 구조 유형으로print __ext_class_MOD_extarray
$2 = 0
print __ext_class_MOD_extarray(1:4)
Cannot perform substring on this type
, 그것이 잘못
에만 따라서 구성의 다른 멤버 중 하나를 보는 것을 방지 나, 제 1 부재 (
svar1
)를 인쇄
print __ext_class_MOD_extstruct
$3 = 0
print __ext_class_MOD_extstruct%svar2
Attempt to extract a component of a value that is not a structure.
나는 인텔 컴파일러를 사용할 때 이것이 잘 작동하기 때문에 이것이 gfortran이 아니라 gfortran에서 실제로 문제가 될 수 있다고 here을 읽었습니다. 컴파일 할 때 추가 플래그가 필요합니까? 이미 사용 중입니다. -g -O0