0
if ((!m_pMediaPage->PageLayer() || !m_pMediaPage->LoadState()) &&
     !m_pMediaPage->m_bRequestList)
{
    GetListInfo();
    m_pMediaPage->m_bRequestList = TRUE;
}

すべての値が 0 の場合、GetListInfo() は実行されません。

PageLayer() と LoadState() は int を返し、m_bRequestList は int です。

基本的に次のように書き換えます。

if ((!0 || !0) && !0)  -or-  if ((1 || 1) && 1)

if ステートメントによって評価される値は、実際にはデバッガーから見たものとは異なるとしか思えません。

Visual Studio 2005 を使用しており、1 行目と 4 行目にブレークポイントを設定して値を調べ、if ステートメントで実行されるかどうかを確認します。これをデバッグする方法が他にわかりません。

先ほど言ったように、ブレークポイント 1 のときにデバッガーから見た 3 つの値はそれぞれ 0 です。

.h の関数:

int  PageLayer() {return m_iCurrentLayer;} - protected
BOOL LoadState() {return m_bLoadDone;}     - protected

ブール:

typedef int BOOL;
4

2 に答える 2

2

この条件ステートメントは、さまざまな関数から返されるすべての値がゼロを返す場合に実行されるかのように見えます。関数の本体が実行されない場合、次のように問題をデバッグします。

  1. if-ステートメントの前のすべての関数の値をログに記録します。

    std::cout << "page-layer=" << !m_pMediaPage->PageLayer() << ' '
              << "load-state=" << !m_pMediaPage->LoadState() << ' '
              << "request-list=" << !m_pMediaPage->m_bRequestList << '\n';
    

    はい、デバッガーはこれらの値も表示する必要がありますが、出力される値が実際に評価される値であることに大きな信頼を置いています。

  2. 何がうまくいかないかについて必要な洞察が得られない場合は、状態を別々の部分に分解し、各レベルで成功を確認します。たとえば、次のようになります。

    if (!m_pMediaPage->PageLAyer()) {
        std::cout << "page-layer is not set\n";\
    }
    if (!m_pMediaPAge->LoadState()) {
        std::cout << "load-state is not set\n";
    ...
    
  3. これでも洞察が得られない場合は、関数が変な値を返すのではないかと疑い始め、さまざまな結果が変な値であることを確認し、-Eオプションを使用して前処理した後に出力を調べ始めます。

于 2013-09-20T20:50:10.740 に答える
1

質問に VS2005 のタグを付けました。長い間修正されてきたコンパイラの問題が発生していないことを確認するために、関連するすべてのサービス パックがインストールされていますか?

次に、リストした関数は非常に単純なセッターのように見えます (問題とは関係ありませんが、それらを const にしたい場合があります)。

デバッガーを使用してステップスルーしているため、それらがすべてゼロであるというアサーションを確認することは価値がある場合があります。

bool plCond = (m_pMediaPage->PageLayer());
bool lsCond = (m_pMediaPage->LoadState());
bool rlCond = (m_pMediaPage->m_bRequestList);
bool getListInfoCond = ((!cond1 || !cond2) && !cond3);

if (getListInfoCond)
{
    GetListInfo();
    m_pMediaPage->m_bRequestList = TRUE;
}

これで問題が解決した場合は、heisenbug またはスタック/メモリ ストンプが発生しています。

これで問題が解決しない場合は、原因が突き止められている可能性があります。

これで問題が解決する場合は、コードのアセンブリを調べて、何らかの形でコンパイラのバグが発生したかどうかを確認してください。

于 2013-09-21T01:51:49.713 に答える