Give more explicit error messages when watchpoint creation command (watchpoint set) fails,

like number of supported hardware watchpoints reached or the watch size is not allowed.

llvm-svn: 157948
This commit is contained in:
Johnny Chen 2012-06-04 20:08:23 +00:00
parent 8d4688718b
commit 3cb41e82cb
3 changed files with 45 additions and 2 deletions

View File

@ -26,6 +26,9 @@ namespace lldb_private {
{
public:
static bool
IsWatchSizeSupported(uint32_t watch_size);
OptionGroupWatchpoint ();
virtual

View File

@ -59,6 +59,20 @@ CheckTargetForWatchpointOperations(Target *target, CommandReturnObject &result)
return true;
}
static void
CheckIfWatchpointsExhausted(Target *target, CommandReturnObject &result)
{
uint32_t num_supported_hardware_watchpoints;
Error error = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
if (error.Success())
{
uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize();
if (num_current_watchpoints >= num_supported_hardware_watchpoints)
result.AppendErrorWithFormat("Number of supported hardware watchpoints (%u) has been reached.\n",
num_supported_hardware_watchpoints);
}
}
#include "llvm/ADT/StringRef.h"
// Equivalent class: {"-", "to", "To", "TO"} of range specifier array.
@ -943,6 +957,7 @@ CommandObjectWatchpointSetVariable::Execute
CommandReturnObject &result
)
{
Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
ExecutionContext exe_ctx(m_interpreter.GetExecutionContext());
StackFrame *frame = exe_ctx.GetFramePtr();
if (frame == NULL)
@ -998,6 +1013,11 @@ CommandObjectWatchpointSetVariable::Execute
// Find out the size of this variable.
size = m_option_watchpoint.watch_size == 0 ? valobj_sp->GetByteSize()
: m_option_watchpoint.watch_size;
if (!m_option_watchpoint.IsWatchSizeSupported(size))
{
result.GetErrorStream().Printf("Watch size of %lu is not supported\n", size);
return false;
}
}
} else {
const char *error_cstr = error.AsCString(NULL);
@ -1011,7 +1031,7 @@ CommandObjectWatchpointSetVariable::Execute
// Now it's time to create the watchpoint.
uint32_t watch_type = m_option_watchpoint.watch_type;
Watchpoint *wp = exe_ctx.GetTargetRef().CreateWatchpoint(addr, size, watch_type).get();
Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type).get();
if (wp) {
if (var_sp && var_sp->GetDeclaration().GetFile()) {
StreamString ss;
@ -1027,6 +1047,7 @@ CommandObjectWatchpointSetVariable::Execute
} else {
result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n",
addr, size);
CheckIfWatchpointsExhausted(target, result);
result.SetStatus(eReturnStatusFailed);
}
@ -1200,10 +1221,15 @@ CommandObjectWatchpointSetExpression::ExecuteRawCommandString
}
size = with_dash_x ? m_option_watchpoint.watch_size
: target->GetArchitecture().GetAddressByteSize();
if (!m_option_watchpoint.IsWatchSizeSupported(size))
{
result.GetErrorStream().Printf("Watch size of %lu is not supported\n", size);
return false;
}
// Now it's time to create the watchpoint.
uint32_t watch_type = m_option_watchpoint.watch_type;
Watchpoint *wp = exe_ctx.GetTargetRef().CreateWatchpoint(addr, size, watch_type).get();
Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type).get();
if (wp) {
if (var_sp && var_sp->GetDeclaration().GetFile()) {
StreamString ss;
@ -1219,6 +1245,7 @@ CommandObjectWatchpointSetExpression::ExecuteRawCommandString
} else {
result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n",
addr, size);
CheckIfWatchpointsExhausted(target, result);
result.SetStatus(eReturnStatusFailed);
}

View File

@ -45,6 +45,19 @@ g_option_table[] =
};
bool
OptionGroupWatchpoint::IsWatchSizeSupported(uint32_t watch_size)
{
for (uint32_t i = 0; i < llvm::array_lengthof(g_watch_size); ++i)
{
if (g_watch_size[i].value == 0)
break;
if (watch_size == g_watch_size[i].value)
return true;
}
return false;
}
OptionGroupWatchpoint::OptionGroupWatchpoint () :
OptionGroup()
{