Debugger[CDB]: Add a pretense to breakpoint conditions.

Add the infrastructure for checking on breakpoint conditions
on the QtCreator side (for conditions, bitfield watchpoints).
Have cdb evaluate breakpoint conditions as integer expressions.
This commit is contained in:
Friedemann Kleint
2011-03-23 15:08:57 +01:00
parent efed3fd7cf
commit 435b4608d9
7 changed files with 178 additions and 8 deletions

View File

@@ -756,3 +756,54 @@ std::string gdbmiBreakpoints(CIDebugControl *ctrl,
str << ']';
return str.str();
}
std::string msgEvaluateExpressionFailed(const std::string &expression,
const std::string &why)
{
std::ostringstream str;
str << "Failed to evaluate expression '" << expression << "': " << why;
return str.str();
}
bool evaluateExpression(CIDebugControl *control, const std::string expression,
ULONG desiredType, DEBUG_VALUE *v, std::string *errorMessage)
{
// Ensure we are in C++
ULONG oldSyntax;
HRESULT hr = control->GetExpressionSyntax(&oldSyntax);
if (FAILED(hr)) {
*errorMessage = msgEvaluateExpressionFailed(expression, msgDebugEngineComFailed("GetExpressionSyntax", hr));
return false;
}
if (oldSyntax != DEBUG_EXPR_CPLUSPLUS) {
HRESULT hr = control->SetExpressionSyntax(DEBUG_EXPR_CPLUSPLUS);
if (FAILED(hr)) {
*errorMessage = msgEvaluateExpressionFailed(expression, msgDebugEngineComFailed("SetExpressionSyntax", hr));
return false;
}
}
hr = control->Evaluate(expression.c_str(), desiredType, v, NULL);
if (FAILED(hr)) {
*errorMessage = msgEvaluateExpressionFailed(expression, msgDebugEngineComFailed("Evaluate", hr));
return false;
}
if (oldSyntax != DEBUG_EXPR_CPLUSPLUS) {
HRESULT hr = control->SetExpressionSyntax(oldSyntax);
if (FAILED(hr)) {
*errorMessage = msgEvaluateExpressionFailed(expression, msgDebugEngineComFailed("SetExpressionSyntax", hr));
return false;
}
}
return true;
}
bool evaluateInt64Expression(CIDebugControl *control, const std::string expression,
LONG64 *v, std::string *errorMessage)
{
*v= 0;
DEBUG_VALUE dv;
if (!evaluateExpression(control, expression, DEBUG_VALUE_INT64, &dv, errorMessage))
return false;
*v = dv.I64;
return true;
}