2017-09-10 5 views
1

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)하지만, 외부/전역 변수를 표시합니다 이클립스의 변수 목록 돈 '이 간단한 예를 생각해 목록에 나타나지 않습니다. "표현식"보기에 수동으로 입력하려고하면 누락 된 기호를 평가할 수 없다는 오류가 발생합니다.

여러 오류가보고됩니다.

1) MI 명령을 실행하지 못했습니다 : -var 작성 - 디버거 백 엔드에서 * extvar 오류 메시지 : -var 만들 : 변수 개체를 만들 수 없습니다 변수 개체를 만들 수 없습니다

2)

3) MI 명령을 실행하지 못했습니다. -data-evaluate-expression extvar 디버거 백 엔드의 오류 메시지 : 현재 컨텍스트에서 기호 "extvar"가 없습니다. 는 -var 만들 : 변수 개체를 만들 수 없습니다

내가 사용하는 특별한 표기를 발견 디버거 백 엔드에서 * 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

답변

0

EDIT :이 문제는 일부 버전에서 해결되었습니다 (gfortran 6.2.0 MacOS에서는 gdb 7.12이지만 우분투에서는 같은 버전이 아닙니다.) 아래 단계를 시도하기 전에 최신 버전으로 업데이트하십시오.

Eclipse에서도 호환되는 해결 방법을 발견했습니다. 바이너리가 변수 유형에 대한 정보를 추적하지 않고 메모리의 주소 만 추적하는 것으로 보입니다. 따라서 변수는 적절한 유형으로 변환하여 볼 수 있습니다. Eclipse의 "표현식"탭에 __ext_class_MOD_extstruct을 입력 한 다음 항목을 마우스 오른쪽 버튼으로 클릭하고 "입력 할 캐스트 ..."를 입력하고 extstruct_type을 입력하십시오! 또는 '표현'탭에

(extstruct_type)__ext_class_MOD_extstruct 

을 입력하면됩니다. 별표는 생략됩니다 (C 구문과 다름). 동일은 gdb를 명령 줄에서 달성 할 수 있으며, 개인 회원은 % 구분 기호를 사용하여 이름으로 얻을 수 있습니다 :

print ((extstruct_type)(__ext_class_MOD_extstruct) 
$5 = (0, 0) 
print ((extstruct_type)(__ext_class_MOD_extstruct)%svar2 
$6 = 0 
는 C를 사용하고있는 것으로 보인다 이클립스의 "표현"옵션 "배열로 표시 ...이"실패

print [email protected] 
$7 = (0, 0, 0, 0) 
print __ext_class_MOD_extarray(2) 
Cannot perform substring on this type 

주 개별 배열 요소를 액세스하는 것이 여전히 일부 버전에서 실패 : 포트란 GDB와 호환되지 않지만 수동 별표 생략시 작동 구 포인터 연산 (*). 최신 릴리스에서이 문제를 한 번에 모두 해결하기를 바랍니다.

관련 문제