std::string を使用して条件付きブレークポイントを作成する方法
-
20-09-2019 - |
質問
この関数があるとします。
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
条件付きブレークを設定するにはどうすればよいですか newString
特定の値がありますか?(ソースは変えずに)
条件を設定する newString == "my value"
「オーバーロードされた演算子が見つかりません」というエラーでブレークポイントが機能しませんでした
解決
いくつかの検索はこれを行うにはどのような方法を上げることができませんでした。推奨代替品は、あなたのコードでテストを入れて、標準のブレークポイントを追加するには、次のとおりです。
if (myStr == "xyz")
{
// Set breakpoint here
}
または個々の文字の比較から、あなたのテストを構築します。でも、文字列内の個々の文字を見ているのは少しdiceyです。 Visual Studio 2005の中で私は
のようなメンバ変数に掘り下げる必要がありましたmyStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
これらのアプローチのいずれも、非常に満足です。私たちは、標準ライブラリのユビキタス機能へのより良いアクセスを持っている必要があります。
他のヒント
のVisual Studio 2010/2012でもっと簡単な方法があります。
あなたはANSIにはこれを使用して探しているものを達成するために:
strcmp(newString._Bx._Ptr,"my value")==0
とUnicodeに(NEWSTRINGがUnicodeであれば)、これを使用します:
wcscmp(newString._Bx._Ptr, L"my value")==0
そこだけで比較するよりも、あなたが行うことができますより多くのものがあり、あなたはここでそれについての詳細を読むことができます:
<のhref = "http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc-developers-using-文字列関数・イン・条件付きbreakpoints.aspx "> http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc -developers-使用列関数イン条件付きbreakpoints.aspx の
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
私はブラッドの答えに似たものを使用してこれを回避する必要がありましたが(さらに、 デバッグブレーク() コードから直接切り離すため)、コードの一部を編集/再コンパイル/再実行するのは時間がかかりすぎるか、まったく不可能な場合があります。
幸いなことに、std::string クラスの実際のメンバーに侵入することは可能のようです。一つの方法が挙げられています ここ -- そして彼は特に VS2010 について言及していますが、以前のバージョンでも個別の文字に手動でアクセスできます。したがって、2010 を使用している場合は、素晴らしいものを使用できます。 strcmp()
関数など(より詳しい情報), ただし、あなたが私と同じで、まだ 2008 以前を使用している場合は、次のような条件付きブレークポイントを設定することで、ボロボロでひどい、しかし機能的な代替手段を思いつくことができます。
strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
strVar._Bx._Ptr[2] == 'c'
strVar の最初の 3 文字が「abc」の場合にブレークします。もちろん、文字を追加して続行することもできます。醜い..でも今は少し時間が節約できました。
VS2012ます:
参照不正なメモリ をnewString._Bx._Ptr
(OBWANDOの答えのように)ので、私は、以下の条件を使用しました
strcmp( newString._Bx._Buf, "my value")==0
、それが働いていた...
@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
VS2017で、私は条件を設定することができました
strcmp(&newString[0], "my value") == 0
newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
文字
を比較するよりも良い作品の文字列を比較します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'