89

私がこの関数を持っているとしましょう:

std::string Func1(std::string myString)
{
   //do some string processing 
   std::string newString = Func2(myString)
   return newString;  
}

newString特定の値がある場合に条件付きブレークを設定するにはどうすればよいですか?(ソースを変更せずに)

条件の設定 newString == "my value"

ブレークポイントが機能せず、「オーバーロードされた演算子が見つかりません」というエラーで無効になりました

4

12 に答える 12

93

Visual Studio 2010/2012 にはもっと簡単な方法があります。

ANSI で探しているものを実現するには、次を使用します。

strcmp(newString._Bx._Ptr,"my value")==0 

Unicode (newString が unicode の場合) では、次のように使用します。

wcscmp(newString._Bx._Ptr, L"my value")==0 

比較するだけでなく、できることは他にもあります。詳細については、次を参照してください。

http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc-developers-using-string-functions-in-conditional-ブレークポイント.aspx

于 2013-03-04T07:49:50.403 に答える
50

一部の検索では、これを行う方法が見つかりませんでした。推奨される代替手段は、コードにテストを配置し、標準のブレークポイントを追加することです。

if (myStr == "xyz")
{
    // Set breakpoint here
}

または、個々の文字の比較からテストを構築します。文字列内の個々の文字を見るだけでも、少し危険です。Visual Studio 2005 では、次のようなメンバー変数を掘り下げる必要がありました

myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'

これらのアプローチはどちらも満足できるものではありません。標準ライブラリのユビキタス機能へのアクセスを改善する必要があります。

于 2009-12-08T00:04:35.230 に答える
8

Bradの答えに似たものを使用してこれを回避する必要がありましたが(さらに、DebugBreak()を使用してコードから直接切り離す)、コードの一部を編集/再コンパイル/再実行するのに時間がかかりすぎるか、まったく不可能な場合があります。

幸いなことに、std::stringクラスの実際のメンバーに侵入することは明らかに可能です。ここでは1つの方法について説明します。彼は、VS2010を具体的に呼び出していますが、以前のバージョンでは、個々の文字に手動でアクセスできます。したがって、2010を使用している場合は、素敵なstrcmp()関数などを使用できます(詳細)。ただし、私のようで、2008年以前を使用している場合は、不規則でひどいが機能的な代替手段を思い付くことができます。次のような条件付きのブレークポイントを設定します。

strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
   strVar._Bx._Ptr[2] == 'c'

strVarの最初の3文字が「abc」の場合にブレークします。もちろん、追加の文字を使用して続行できます。醜い..しかし、それはちょうど今私に少し時間を節約しました。

于 2011-04-22T16:18:23.890 に答える
8

VS2012:

newString._Bx._Ptr (OBWANDOの回答のように)不正なメモリを参照したため、以下の条件を使用しました

strcmp( newString._Bx._Buf, "my value")==0

そしてそれは働いた...

于 2013-11-13T21:12:01.380 に答える
1

文字列の比較は、文字の比較よりもうまく機能します

strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0

これは機能しますが、非常に使いにくく、エラーが発生しやすくなります。

name._Mypair._Myval2._Bx._Buf[0] == 'f' && 
name._Mypair._Myval2._Bx._Buf[1] == '0' && 
name._Mypair._Myval2._Bx._Buf[2] == '0'
于 2018-07-16T19:23:23.983 に答える
0

std::string に条件付きブレークポイントを設定するには、std::string の実際の内部メンバーに設定する必要があります。ウォッチ ウィンドウに表示される内容は簡略化されています。

,!サフィックスを使用して、ウォッチ ウィンドウに変数の実際の構造を表示できます。あなたの例では:

newString,!

MSVC 2015 – 2019 の場合、次を使用できます。

15 文字を超えない文字列の場合:

(newString._Mypair._Myval2._Myres < 16) ?
    strcmp(newString._Mypair._Myval2._Bx._Buf, "short") == 0 : 
    false

(歴史的にも) 長い文字列の場合:

(newString._Mypair._Myval2._Myres < 16) ? false : 
     strcmp(newString._Mypair._Myval2._Bx._Ptr, "My_test_str_value_longer_than_16_chars") == 0

注意:

  • 条件ごとに変数名が2回書かれています!
  • 単一行で式全体が必要です。以下のコピペバージョンを使用してください。

ユニバーサル条件では、テスト値を 2 回、変数名を 3 回入力する必要があります。

(newString._Mypair._Myval2._Myres < 16) ? 
    strcmp(newString._Mypair._Myval2._Bx._Buf, "My_test_string") == 0 : 
    strcmp(newString._Mypair._Myval2._Bx._Ptr, "My_test_string") == 0

注: を使用している場合は、wcscmp代わりに を使用してください。strcmpstd::wstring

C++ での小さな文字列の最適化に関する詳細情報を参照してください https://vorbrodt.blog/2019/03/30/sso-of-stdstring/には、文字列の内部バッファーのサイズを見つけるためのサンプル コードが含まれています。

すべての std:string および std::wstring 単一行バージョンは、コピーと貼り付けに便利です。

(newString._Mypair._Myval2._Myres < 16) ? strcmp(newString._Mypair._Myval2._Bx._Buf, "short") == 0 : false

(newString._Mypair._Myval2._Myres < 16) ? false : strcmp(newString._Mypair._Myval2._Bx._Ptr, "My_test_str_value_longer_than_16_chars") == 0

(newString._Mypair._Myval2._Myres < 16) ? strcmp(newString._Mypair._Myval2._Bx._Buf, "My_test_string") == 0 : strcmp(newString._Mypair._Myval2._Bx._Ptr, "My_test_string") == 0


(newString._Mypair._Myval2._Myres < 16) ? wcscmp(newString._Mypair._Myval2._Bx._Buf, L"short") == 0 : false

(newString._Mypair._Myval2._Myres < 16) ? false : wcscmp(newString._Mypair._Myval2._Bx._Ptr, L"My_test_str_value_longer_than_16_chars") == 0

(newString._Mypair._Myval2._Myres < 16) ? wcscmp(newString._Mypair._Myval2._Bx._Buf, L"My_test_string") == 0 : wcscmp(newString._Mypair._Myval2._Bx._Ptr, L"My_test_string") == 0

上記のすべてのコピー/貼り付けサンプルは、MSVC バージョン 16.9.10 および Windows 10 用のプログラムでテストされています。

于 2021-10-01T16:05:47.950 に答える