1

デバッガで遊んでいます。私が取り組んでいる実際のタスクは、コードを実行するときに命令ポインターがどのように変化するかを監視することです。

しかし、私は他の何かを理解するのに苦労しています。6 行目、strcpy (7 行目)、および 8 行目にブレークポイントを設定しました。ブレークポイントを設定したら、それを実行します。

ブレークポイントを異なる順序で通過するのはなぜですか? ブレークポイント 2、ブレークポイント 1、ブレークポイント 3 ?

私が持っている他の質問... ブレークポイント 1 は 6 行目に設定されました。しかし、そのブレークポイントに到達すると、「char_array2.c:7」と表示されます。行 6 が空であることは承知していますが、ブレークポイントは行 7 の一部を読み取る前に停止しますか?

(gdb) list
1   #include <stdio.h>
2   #include <string.h>
3   
4   int main() {
5      char str_a[20];
6   
7      strcpy(str_a, "Hello World!\n");
8      printf(str_a);
9   }
(gdb) 
Line number 10 out of range; char_array2.c has 9 lines.
(gdb) break 6
Breakpoint 1 at 0x100000ec8: file char_array2.c, line 6.
(gdb) break strcpy
Breakpoint 2 at 0x20c49ba5c77e20
(gdb) break 8
Breakpoint 3 at 0x100000edd: file char_array2.c, line 8.
(gdb) run
Starting program: /Users/Guest1/Desktop/Hacking files/char_array2 
Reading symbols for shared libraries +. done

Breakpoint 2, 0x00007fff8601ce20 in strcpy ()
(gdb) continue
Continuing.

Breakpoint 1, main () at char_array2.c:7
7      strcpy(str_a, "Hello World!\n");
(gdb) continue
Continuing.

Breakpoint 3, main () at char_array2.c:8
8      printf(str_a);    
4

2 に答える 2

0

プログラムをどのように構築したかはわかりませんが、コンパイラの最適化を有効にしたと思います。

コンパイラがコードを最適化するとき、実行中のプログラムを観察してもわからない場合 (つまり、論理的に同等のままである場合)、コードを好きなように並べ替えることができます。もちろん、デバッガーを接続してプログラムを停止すると、並べ替えが表示されます。これが、最適化されていないコードをデバッグするのが一般的である理由です。

コンパイラはコード行を並べ替えるだけでなく、各行内のすべての個々の操作を並べ替えることができます。ブレークポイントは通常、指定された行に関連付けられた最初の命令に設定されますが、関数をシングル ステップで実行すると、通常、プログラムが各行に数回ジャンプして戻るように見えます。インターリーブ。

もちろん、コンパイラが重複した操作を削除してコードを最適化する場合、特定の命令がどのソース行に関連しているかが常に明確であるとは限りません。

最後に、コンパイラは、使用されていない、または別のコードと組み合わせることができるコードを自由に完全に削除できるため、コード行にまったくヒットしていないように見える場合があります。

于 2013-01-22T22:24:58.490 に答える
0

Line number 10 out of range; char_array2.c has 9 lines非常に疑わしいです。あなたのGDBは行末を判断できないと思います。ソースファイルに変換\n\r\n、使用するエディターを設定します\r\n

また、私はamsに同意します。完全に確実にするために、明示的な-g -O0オプションでコンパイルしてください。

于 2013-01-23T07:47:33.190 に答える