-1

私は Visual C++ の専門家ですが、Linux 開発は初めてです。Visual Studio では、C ランタイム ライブラリによって実装されたコードを簡単に追跡できます。ソースがインストールされていることを確認する必要があるだけで、malloc()、cout::operator<<() など、好きな関数をすぐに実行できます。

Eclipse の C++ パッケージを使用して開発しようとしています。そこにある C ランタイム ルーチンにステップインするにはどうすればよいですか? Linux はオープンソースなので、オペレーティング システムのルーチンに入るにはどうすればよいですか? 可能だと思われます -- デバッグ情報、ソース コード、またはその両方が不足していますか? 私の構成で何か?

現在、Ubuntu 12.10 を使用しています。私は g++ を使用しています。Makefile プロジェクトをインポートしたことがないので、Eclipse ビルド システムを使用していると思います。Eclipse の C++ プロジェクト ウィザードから単純な "Hello World" プロジェクトを開始しました。

これを少しハッキングした後:

libstdc++6-4.2-dbg パッケージを libstdc ライブラリのデバッグ シンボルと考えてインストールしました。

sudo apt-get install libstdc++6-4.2-dbg

次のステップで dpkg-dev が必要だと言われたので、dpkg-dev もインストールしました。

sudo apt-get install dpkg-dev

libc6 ソースをホームの下のディレクトリにインストールしてみました。

apt-get source libc6

この時点で、printf() にステップ インしようとすると、printf.c が見つからないことがわかります。malloc や strlen に踏み込むことができません。これは、C ランタイム ライブラリが Linux でどのように考慮されているかを理解していないことを示唆しています。libc、glib、および libstdc++ の違いは? どのパッケージが必要ですか?

持っている printf.c ファイル (~/eglibc-2.15/stdio-common/printf.c) を開くように Eclipse に要求しても、ファイルは開かれません (ソースを表示するようにデバッグ ウィンドウが調整されません)。 )、ファイルが見つからないというエラー メッセージを表示するウィンドウを再描画します。(「printf.c」でソース ファイルが見つかりません。ファイルを検索するか、ソース ルックアップ パスを編集してその場所を含めます。)

4

2 に答える 2

0

一方、Linux のカーネル開発者として、個々のツールを個別に使用することは学ぶのに良いことであり、Basile の答えは usefuel であることに同意します。

ただし、C ランタイム ライブラリへのステップ インは、Eclipse でも同様に可能です。しかし、OS がオープン ソースであるからといって、OS 内を自由に動き回ることができるわけではありません。実際、ユーザー モード コードから OS 自体にステップ インすることはできません。KGDB (ググってください) が必要で、デバッグ中のコンピューターに接続するための 2 台目のコンピューターが必ず必要です。しかし、ほとんどの場合、カーネルから戻るまで他の作業が行われないようにします。open()、ある時点で、保持しているロックが解除されるまで、ファイルシステム全体が完全に機能しなくなる可能性があります。これは確かに一部のソフトウェアを混乱させます。これは、カーネルのデバッグ時に予想外に動作する可能性のある例にすぎないことに注意してください。厳密に「これを行ったところ、実際に起こった」というわけではありません。デバッグ中にマシンが停止するため、同じマシンでデバッガーを実行することはできません。

Eclipse 経由でデバッグできるユーザーモードに戻ると、基本的に必要なのは、関心のあるランタイム ライブラリのソース コードをインストールすることだけです。 Linux システムで実行するすべてのソフトウェアは、ソース コードとして入手できます。デバッグ シンボルを使用して一部のライブラリを再コンパイルする必要がある場合があります。また、Windows の場合と同様に、デバッガーがソース コードを見つける方法を認識していることを確認する必要があります。それ以外はすべて、Eclipse のデバッガーで処理する必要があります。私はローカルとリモートの両方のデバッグに Eclipse を約 3 年間使用しましたが、一般的には動作します。所々に癖がありますが、それはほとんどすべてのデバッガに当てはまります。

幸運を。

于 2012-12-25T10:54:27.607 に答える
0

まず、Linux でソフトウェアを開発するのに Eclipse は必要ありません。orコンパイラーを実行する or (エディターとして)、(バージョン管理)、(ビルダー) などの独立したツール (コマンドライン) を使用してそれを行う方法を学ぶ必要があります (& は両方ともemacsGCC geditgitGnu makeCompiler Collectionの一部です)。gccg++gccg++

実際、Eclipse に依存しないことで、より多くのことを学ぶことができます。仕事をしている実際のコマンドを隠すだけかもしれませんが、それらが実際に何であるかを理解する必要があります。

-g -Wall オプションを GCCに渡します。-gオプションはデバッグ情報を要求し、オプション-Wallはほとんどすべての警告を要求します。警告が表示されなくなるまでコードを改善してください。

また、オペレーティング システムはsyscallを提供しています (これは、カーネルによってアプリケーションに提供される操作です。アプリケーションの観点からは、syscall はアトミックであるため、ステップインすることはできません。ただしstrace、何らかの実行によって行われたすべての syscall が表示される場合があります)。システム ライブラリ内で段階的に実行したい場合libcは、そのデバッグ バリアント (たとえば、いくつかのlibc6-dbgパッケージ) が必要です。ただし、通常はシステム ライブラリの内部に飛び込む必要はありません。

http://advancedlinuxprogramming.com/を参照してください。

次に、gdbバイナリ プログラムをデバッグするために使用します。

そのため、ターミナル内のステップバイステップの手順:

  • ソースファイルをemacsまたはgeditで編集します

  • GCCの使用方法を学習します。単一のソース C++ プログラムの場合は、それをコンパイルし、ターミナルにg++ -Wall -g source.cc -o progbin入力して実行します。プログラムがデバッグされ、満足のいくものである場合にのみ、最適化を使用してコンパイルします ( orフラグをor./progbinに与えることにより) 。-O-O2gccg++

  • gdbを使用してプログラムをデバッグします ( でコンパイル-g)。

  • 複数ファイルの C++ プログラムの場合は、 makeの使用方法を学習することを検討してください

  • gitのようなバージョン管理システムを使用する

初心者の場合は、Eclipse を使用しないことをお勧めします。これは、実際に何が起こっているのかを隠してしまうためです (Eclipse は上記のコマンドのような他のツールを実行しているだけです)。

Linux でのソフトウェア開発には、Windows での開発とは異なる考え方が必要です。実際には、独立したツールを自由に組み合わせて使用​​しているため、それぞれについて少しずつ学習することをお勧めします。

注意。のような「システム」関数malloc(のようなシステムコールの上にあります) の中に入るには、パッケージmmapのデバッグ バリアントが必要であり、 etcに設定する必要があります...libcaptitude install libc6-dbgLD_LIBRARY_PATH/usr/lib/debug

于 2012-12-25T08:40:33.223 に答える