3

OS X Mavericks で Go (go1.3 darwin/amd6) と GoClipse 0.8 を使用しています...

(ブレークポイントを設定した後) デバッガーの実行に問題があったため、スタック オーバーフローとインターネットの残りの部分を精査し、gdb をインストールする必要があることを発見しました。

次の指示に従って(Tに)(HomeBrew経由でgdbをインストールすることにより):

http://ntraft.com/installing-gdb-on-os-x-mavericks/

ここで、ブレークポイントを配置して Eclipse のデバッガーで go プログラムを実行すると、Go コードではなくアセンブリ コードがステップ実行されます。

例えば

私のgoプログラム内の次の行にブレークポイントが設定されました:

responses := [] *HttpResponse{}

デバッガーを実行すると、次のファイルが開きました。

rt0_darwin_amd64.s

それが設定されたコード行は次のとおりです。

MOVQ    $_rt0_go(SB), AX

そして、コードを「ステップオーバー」しようとすると、これらのアセンブリファイルを介して実行され続けました...

私はアセンブリを知りません (そして、それを学ぶ時間がないと思います)... Eclipse デバッガーを使用して Go プログラムをデバッグする簡単な方法はありますか?

4

2 に答える 2

5

Go プログラムが停止すると、デバッグ ビューには何が表示されますか? (デバッグ ビューは、スタック トレースを表示するものです)。次のようなスタック トレースが表示されますか。

Thread [1] 0 (Suspended : Breakpoint)   
    main() at rt0_windows_amd64.s:15 0x42a400   
    KERNEL32!BaseThreadInitThunk() at 0x773259ed    
    0x0 

(注: OSX の場合はmain() at rt0_darwin_amd64.s)

もしそうなら、何が起こっているのか: プログラムを起動すると、プログラムの起動時に "main" 関数で自動的に停止しました。しかし、それは Go のメインではなく、コードが C で記述された内部ランタイム「メイン」関数です (そして、利用可能なソースがないため、アセンブラーが表示されます)。これは、次のように、起動構成オプションの最初のオプションによって制御されます。 デバッグ オプション

「main.main」に変更して実際のGoメインで停止するか、単にチェックを外すことができます。いずれにしても、デバッガーがそこで停止した場合は、実行/再開 (F8) をクリックして続行できます。

于 2014-07-08T12:46:37.800 に答える
1

何が起こっているかというと、デバッグ情報がバイナリから取り除かれていることだと思います。

デバッグ モードでバイナリをコンパイルするときは、 http://golang.org/doc/gdb-gcflags "-N -l"に記載されているフラグを追加してください。

gc コンパイラによって生成されるコードには、関数呼び出しのインライン化と変数の登録が含まれます。これらの最適化により、gdb を使用したデバッグが困難になることがあります。デバッグ時にそれらを無効にするには、フラグ -gcflags "-N -l" を、デバッグ中のコードのビルドに使用される go コマンドに渡します。

于 2014-07-10T15:39:21.790 に答える