2017-09-10 17 views
1

Eclipse(Neon.3リリース4.6.3)とgdb 7.11.1およびgfortran 5.4.0を使用して実行ファイルをデバッグしていますローカルサブルーチン変数とシンプルな外部変数を正しく見ることができるようです。この簡単な例を考えてみましょう:グローバルアレイ/構造体は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 

Eclipseの変数リストが正しく、彼らはモジュール/アレイのが、任意のグローバル/外部変数(extvar, extarray, extstruct)ドン」している場合でも、ローカル変数(i)と入力(invar)が表示されますリストには表示されません。 「式」ビューに手動で入力しようとすると、不足しているシンボルを評価できないというエラーが表示されます。

複数のエラーが報告されました。

1)はMIコマンドの実行に失敗しました: -var-作成 - デバッガのバックエンドから* extvarエラーメッセージを: -var-作成:変数のオブジェクトを作成することができませんでし変数オブジェクトを作成できません

2)

3)MIコマンドの実行に失敗しました: -data-evaluate-expression extvarデバッガのバックエンドからのエラーメッセージ:現在のコンテキストに "extvar"というシンボルはありません。

4)はMIコマンドの実行に失敗しました: -var-作成 - デバッガのバックエンドから* extvarエラーメッセージ: は-var-作成:変数オブジェクト

を作成することができませんが、私が使用される特殊な表記法を発見しました

nm <binaryname> | grep <modulename> 

は、私は、その後、一般的に次のように入力してGDBでのグローバルモジュールのメンバーを見ることができます:

コンパイラによってコマンドを使用して、バイナリ実行可能ファイルにこれらのグローバル変数を格納します
print __<modulename>_MOD_<membername> 

ただし、は、モジュールの単純なメンバータイプでのみ機能します。例えば、私が正しく整数メンバーを見ることができます:整数の静的アレイについて

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 

、それは不適切だけ従って構造体の他のメンバーのいずれかを表示するから私を防止する、第一部材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. 

Intelコンパイラを使用しているときにうまく動作するため、gfortranではgfortranでは実際に問題が発生する可能性があります。hereを読んでいます。コンパイル時に設定する必要がある余分なフラグがありますか?私はすでに使用しています-g -O0

答えて

0

EDIT:この問題はいくつかのバージョンで解決されています(gfortran 6.2。0 MacOSではgdb 7.12ですが、Ubuntuでは同じバージョンではありません)。 以下の手順を試す前に、最新バージョンに更新してください。

Eclipseで互換性のある回避策が見つかりました。バイナリは、メモリ内の変数の型に関する情報だけを追跡しているようには見えません。したがって、変数は適切な型にキャストすることで表示できます。 Eclipseの「式」タブに「__ext_class_MOD_extstruct」と入力し、右クリックして「タイプ入力」を選択してextstruct_typeと入力します。または、「式」タブに「

(extstruct_type)__ext_class_MOD_extstruct 

と入力するだけです。アスタリスクは省略されています(Cの構文とは異なります)。同じことは、GDBのコマンドラインで達成することができ、個々のメンバーは%区切り文字を使用して、名前で入手可能である:それはCを使用しているように見えるよう

print ((extstruct_type)(__ext_class_MOD_extstruct) 
$5 = (0, 0) 
print ((extstruct_type)(__ext_class_MOD_extstruct)%svar2 
$6 = 0 

Eclipseの「表現」オプション「Arrayなどの表示...」は失敗します

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

注個々の配列要素にアクセスすることはまだいくつかのバージョンで失敗した:FORTRANのためのGDBと互換性がありませんが、それは手動でアスタリスクを省略した場合に動作する構文ポインタ演算(*)。これらの問題が新しいリリースで一度だけ修正されることを期待しましょう。

関連する問題