[解決済み] なぜGDBは予測できない行間ジャンプをしたり、変数を"<value optimized out>"と表示したりするのですか?
2023-04-20 10:38:28
質問
gdbのこの挙動を説明できる人はいますか?
900 memset(&new_ckpt_info,'\0',sizeof(CKPT_INFO));
(gdb)
**903 prev_offset = cp_node->offset;**
(gdb)
**905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb->shm_addr.ckpt_addr+sizeof(CKPT_** HDR),i_offset);
(gdb)
**903 prev_offset = cp_node->offset;**
(gdb)
**905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb->shm_addr.ckpt_addr+sizeof(CKPT_ HDR),i_offset);**
(gdb)
**908 bitmap_offset = client_hdl/32;**
(gdb)
**910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);**
(gdb)
**908 bitmap_offset = client_hdl/32;**
(gdb)
**910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);**
(gdb)
**908 bitmap_offset = client_hdl/32;**
(gdb)
**910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);**
(gdb)
913 found = cpnd_find_exact_ckptinfo(cb , &ckpt_info , bitmap_offset , &offset , &prev_offset);
(gdb)
916 if(!found)
(gdb) p found
$1 = <value optimized out>
(gdb) set found=0
Left operand of assignment is not an lvalue.
なぜ903行目を実行した後、再び905 908 910で同じように実行されるのでしょうか?
もうひとつは
found
は
bool
-型の変数なので、なぜ
value optimized out
?
の値を設定することができません。
found
の値も設定できません。
これはコンパイラの最適化だと思われます(この場合、その
-O2
の値を設定することができます。
found
?
どのように解決するのですか?
最適化されたコードをデバッグするには、アセンブリ言語や機械語を学ぶ必要があります。
GDB TUI モードを使用します。私の GDB では、マイナス記号と Enter キーを入力すると TUI モードが有効になります。次に、C-x 2 (つまり、Control を押しながら X を押して、両方を放してから 2 を押す) を入力します。これでソースとディスアセンブリの分割表示になります。次に
stepi
と
nexti
でマシン命令を1つずつ移動します。TUIウィンドウを切り替えるには、C-x oを使用します。
お使いの CPU の機械語と関数の呼び出し規則に関する PDF をダウンロードしてください。関数の引数や戻り値で何が行われているのか、すぐに認識できるようになります。
レジスタの値を表示するには、次のようなGDBコマンドを使用します。
p $eax
関連
-
initializer element is not constant "というエラーが表示されるのですが?
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] gdbで<value optimized out>は何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
[解決済み] mallocで文字列を確保する
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] Cコードの単体テスト【終了しました
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
-
[解決済み] C言語で "unsigned long "をprintfする方法は?