web-dev-qa-db-ja.com

std :: stringで条件付きブレークポイントを作成する方法

私はこの機能を持っていると仮定します:

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

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

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

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

65
Eli

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

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

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

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

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

44
Brad Payne

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-breakpoints.aspx

75
OBWANDO

VS2017でできること

strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
9
Adriel Santos

VS2012:

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

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

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

8
user2989573

Bradの答えに似たものを使用してこれに対処する必要がありましたが(プラス DebugBreak() を使用してコードを中断します)、時々コードの編集/再コンパイル/再実行が時間がかかりすぎるか、まったく不可能です。

幸いなことに、std :: stringクラスの実際のメンバーを調べることは明らかに可能です。 1つの方法が言及されています here -そして彼は特にVS2010を呼び出していますが、以前のバージョンでは個々の文字に手動でアクセスできます。したがって、2010を使用している場合、Nice strcmp()関数などを使用できます( 詳細) 、次のようなブレークポイント条件を設定することにより、不規則でひどいが機能的な代替案を思いつくことができます。

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

strVarの最初の3文字が「abc」の場合にブレークします。もちろん、追加の文字を使い続けることができます。 glyい..しかし、今は少し時間を節約できました。

8
Doug Kavendek

VS2017では、条件を次のように設定できました。

strcmp(&newString[0], "my value") == 0
2
Rai

@ OBWANDO(ほとんど)に解決策があります ですが、複数のコメントが正しく指摘しているように、実際のバッファーは文字列サイズに依存します。 16がしきい値であることがわかります。適切なバッファーでstrcmpの前にサイズチェックを追加すると機能します。

newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0

または

newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0
2
anik3th

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

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'
1
Jas

VS2015でできること

newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
1