私のバイナリを実行しているときに、GDBが配列をダンプしないことがわかりました。なぜこれが実行可能ファイルのいくつかでのみ起こるのか分かりません。なぜGDBが配列を出力していないのですか?
宣言は非常に単純です:
tbl_account_t accounts[MAX_ACCOUNTS];
私はアレイ(ただの配列)を印刷するとき、私はこれを取得:変数の型を確認
(gdb) print accounts
$16 = 0x618d20 <accounts>
は、すべてがOKです:
(gdb) ptype accounts
type = struct tbl_account {
unsigned short email_len;
unsigned short password_len;
char auto_log_in;
char reserved_char[3];
int reserved_int;
char email[64];
char password[25];
} []
(gdb)
私はデータを持っています:
(gdb) print accounts[1]
$18 = {email_len = 16, password_len = 3, auto_log_in = 0 '\000', reserved_char = "\000\000", reserved_int = 0, email = "[email protected]", '\000' <repeats 47 times>,
password = "123", '\000' <repeats 21 times>}
(gdb)
"print accounts"コマンドを使用して、のの内容を他の実行可能ファイルと同様にダンプすることを期待していました。なぜこれが起こるのですか?
感謝問題が何であるかを知るために私を助けました。 main.cにヘッダ "constants.h"が含まれていなかったので、これは私のソースコードでMAX_ACCOUNTSが宣言されている場所です。 GCCではこれは問題ではないので、コンパイルエラーはありません。しかし明らかにGDBはインクルードの下位階層でシンボル定義を検索しません。 #include "constants.h"をmain.c自身に追加することで、GDBはaccounts []配列のサイズを知ることができました。 – Nulik
私はこれの本当の原因を発見しました。インクルード "constants.h"ではありませんでした。私はライブラリ関数内のコードをトレースしていましたが(私自身のライブラリですが、全く別の共有オブジェクトです)、ライブラリはこの宣言を使用しています: "extern tbl_account_t accounts []"、これがポインタだけが印刷された理由です。 – Nulik
ハ!外部の推測でそれを命じた –