1

使ってます

    p12user@ubuntu:~$ uname -a
    Linux ubuntu 2.6.32-40-generic #87-Ubuntu SMP Tue Mar 6 00:56:56 UTC 2012 x86_64 GNU/Linux

    p12user@ubuntu:~$ gdb -v
    GNU gdb (GDB) 7.1-ubuntu
    Copyright (C) 2010 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>.

    p12user@ubuntu:~/programming$ gcc --version
    gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
    Copyright (C) 2009 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

このプログラムをgdbでデバッグすると、次のようにコンパイルされgcc -g program.cます。

#include <stdio.h>
int main()
{
   int condition1 = 1;
   if(condition1)
   {
      if(!condition1)
      {
         printf("The control shouldn't come here.\n");
      }
   }
   else
   {
      printf("in else\n");
   }
   return 0;
}

動作は次のとおりです。

Breakpoint 1, main () at program.c:4
4               int condition1 = 1;
(gdb) n
5               if(condition1)
(gdb) n
7                       if(!condition1)
(gdb) n
9                               printf("The control shouldn't come here.\n");
(gdb) n
16              return 0;
(gdb) n
17      }
(gdb) 

LINE9での動作はgdbでは予期しないものです。ただし、printステートメントはgdbにのみ表示され、実行されません。そして、inner-IFと一致するELSE(いくつかのprintステートメントを含む)を配置した場合、これは発生しません。また、outer-IFと一致するELSEが削除された場合、これは発生しません。私はここで些細なことを見逃していますか?

4

2 に答える 2

3

あなたが示したプログラムは、ソースコードステートメントが実行可能ファイルにならない可能性があるため、簡単に最適化できるように見えるため、最適化を行わずにプログラムをビルドしていることを確認してください。

GCC では、次を使用します。

gcc -O0 ...

また

g++ -O0 ...

このため。

于 2012-05-22T12:09:23.290 に答える