diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h index d37e6e8489e86e326d748a5a69a123fbe95b70df..908c7b544561e9dbd0cbc32d512600509fcfe477 100644 --- a/lldb/include/lldb/Target/Target.h +++ b/lldb/include/lldb/Target/Target.h @@ -127,6 +127,9 @@ public: uint32_t GetMaximumSizeOfStringSummary() const; + + uint32_t + GetMaximumMemReadSize () const; FileSpec GetStandardInputPath () const; diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp index 4d49e7ba9bd998ac80f1185998b8aa21bc182caa..fe44ad052abdc6fffbd0c1e6086126fc167c7c57 100644 --- a/lldb/source/Commands/CommandObjectMemory.cpp +++ b/lldb/source/Commands/CommandObjectMemory.cpp @@ -44,7 +44,7 @@ g_option_table[] = { LLDB_OPT_SET_3, true , "type" ,'t', required_argument, NULL, 0, eArgTypeNone ,"The name of a type to view memory as."}, { LLDB_OPT_SET_1| LLDB_OPT_SET_2| - LLDB_OPT_SET_3, false, "force" ,'r', no_argument, NULL, 0, eArgTypeNone ,"Necessary if reading over 1024 bytes of memory."}, + LLDB_OPT_SET_3, false, "force" ,'r', no_argument, NULL, 0, eArgTypeNone ,"Necessary if reading over target.max-memory-read-size bytes."}, }; @@ -119,6 +119,7 @@ public: m_num_per_line.Clear(); m_output_as_binary = false; m_view_as_type.Clear(); + m_force = false; } Error @@ -642,15 +643,16 @@ protected: item_count = total_byte_size / item_byte_size; } - if (total_byte_size > 1024 && !m_memory_options.m_force) + uint32_t max_unforced_size = target->GetMaximumMemReadSize(); + + if (total_byte_size > max_unforced_size && !m_memory_options.m_force) { - result.AppendErrorWithFormat("Normally, \'memory read\' will not read over 1Kbyte of data.\n"); - result.AppendErrorWithFormat("Please use --force to override this restriction.\n"); + result.AppendErrorWithFormat("Normally, \'memory read\' will not read over %" PRIu32 " bytes of data.\n",max_unforced_size); + result.AppendErrorWithFormat("Please use --force to override this restriction just once.\n"); + result.AppendErrorWithFormat("or set target.max-memory-read-size if you will often need a larger limit.\n"); return false; } - - DataBufferSP data_sp; size_t bytes_read = 0; if (clang_ast_type.GetOpaqueQualType()) diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index e04613d903277a2094c340ce6c8b157d32ead962..cac31a2bda497ad2a6ab651b6e03a59ddecb1d2a 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -2295,6 +2295,7 @@ g_properties[] = { "exec-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "Executable search paths to use when locating executable files whose paths don't match the local file system." }, { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." }, { "max-string-summary-length" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." }, + { "max-memory-read-size" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." }, { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean , false, true , NULL, NULL, "Consult the platform module avoid list when setting non-module specific breakpoints." }, { "arg0" , OptionValue::eTypeString , false, 0 , NULL, NULL, "The first argument passed to the program in the argument array which can be different from the executable itself." }, { "run-args" , OptionValue::eTypeArgs , false, 0 , NULL, NULL, "A list containing all the arguments to be passed to the executable when it is run. Note that this does NOT include the argv[0] which is in target.arg0." }, @@ -2329,6 +2330,7 @@ enum ePropertyExecutableSearchPaths, ePropertyMaxChildrenCount, ePropertyMaxSummaryLength, + ePropertyMaxMemReadSize, ePropertyBreakpointUseAvoidList, ePropertyArg0, ePropertyRunArgs, @@ -2624,6 +2626,13 @@ TargetProperties::GetMaximumSizeOfStringSummary() const return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); } +uint32_t +TargetProperties::GetMaximumMemReadSize () const +{ + const uint32_t idx = ePropertyMaxMemReadSize; + return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); +} + FileSpec TargetProperties::GetStandardInputPath () const {