GNU gdb Fedora(6.8-37.el5)Kernal 2.6.18-164.el5
アプリケーションをデバッグしようとしています。ただし、バイナリをgdbに渡すたびに次のように表示されます。
(no debugging symbols found)
バイナリのファイル出力は次のとおりです。ご覧のとおり、削除されていません。
vid: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
次のCFLAGSでコンパイルしています。
CFLAGS = -Wall -Wextra -ggdb -O0 -Wunreachable-code
ここで簡単なものが不足している場合、誰か教えてもらえますか?
一部のLinuxディストリビューションは、gdb
スタイルのデバッグシンボルを使用しません。 (IIRCはdwarf2
。)
一般に、gcc
とgdb
は、使用するデバッグシンボルの種類に関して同期します。特定のスタイルを強制すると、問題が発生します。他に何かが必要だとわかっている場合を除き、-g
。
-g
が存在するときに "デバッグシンボルが見つかりません"の最も一般的な原因は、リンク行のどこかに "迷い" -s
または-S
引数があることです。
man ld
から:
-s
--strip-all
Omit all symbol information from the output file.
-S
--strip-debug
Omit debugger symbol information (but not all symbols) from the output file.
アプリケーションは、-g
オプションを使用してコンパイルおよびリンクする必要があります。つまり-g
をCPPFLAGSとLDFLAGSの両方に配置する必要があります。
Android用にコンパイルしている場合は、-gの代わりに-ggdbも試してください!
-ggdbを-gに置き換え、stripコマンドでバイナリを削除しないようにします。
これはかなり前に回答されましたが、最近、同様の問題を解決するために何時間も費やしました。セットアップは、Eclipse CDT Neon.2を使用してDebian 8を実行するローカルPC、Debian 7を実行するリモートARM7ボード(Olimex)です。ツールチェーンは、リモートボードのgdbserverとローカルPCのLinaro GDBを使用するLinaro 4.9です。私の問題は、デバッグセッションが開始されてプログラムが実行されるが、ブレークポイントが機能せず、手動で一時停止すると「ソースが見つからない」という結果になることでした。私のコンパイル行オプション(Linaro gcc)には、多くの人が示唆しているが、まだ同じ問題である-ggdb -O0が含まれていました。最終的に、リモートボードで適切なgdbを試してみましたが、シンボルが表示されませんでした。不思議なことに、「ファイル」は、ターゲットの実行可能ファイルでデバッグが削除されないことを報告しました。
最終的には、リンカーオプションに-gを追加することで問題を解決しました。これがなぜ役立つのかを完全に理解しているとは主張しませんが、万が一の場合に備えて他の人にこれを伝えたかったのです。この場合、Linuxは実際にリンカーオプションで-gを必要としました。