Author: enrico Date: Tue Nov 3 18:02:08 2015 New Revision: 252018 URL: http://llvm.org/viewvc/llvm-project?rev=252018&view=rev Log: Fix an issue where LLDB would truncate summaries for string types without producing any evidence thereof
Modified: lldb/trunk/include/lldb/Core/ValueObject.h lldb/trunk/include/lldb/DataFormatters/StringPrinter.h lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/stringprinter/main.cpp lldb/trunk/source/Core/ValueObject.cpp lldb/trunk/source/DataFormatters/StringPrinter.cpp lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp lldb/trunk/source/Target/Process.cpp Modified: lldb/trunk/include/lldb/Core/ValueObject.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=252018&r1=252017&r2=252018&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObject.h (original) +++ lldb/trunk/include/lldb/Core/ValueObject.h Tue Nov 3 18:02:08 2015 @@ -840,7 +840,7 @@ public: bool IsCStringContainer (bool check_pointer = false); - size_t + std::pair<size_t,bool> ReadPointedString (lldb::DataBufferSP& buffer_sp, Error& error, uint32_t max_length = 0, Modified: lldb/trunk/include/lldb/DataFormatters/StringPrinter.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/StringPrinter.h?rev=252018&r1=252017&r2=252018&view=diff ============================================================================== --- lldb/trunk/include/lldb/DataFormatters/StringPrinter.h (original) +++ lldb/trunk/include/lldb/DataFormatters/StringPrinter.h Tue Nov 3 18:02:08 2015 @@ -260,6 +260,7 @@ namespace lldb_private { m_source_size(0), m_escape_non_printables(true), m_zero_is_terminator(true), + m_is_truncated(false), m_language_type(lldb::eLanguageTypeUnknown) { } @@ -387,6 +388,19 @@ namespace lldb_private { } ReadBufferAndDumpToStreamOptions& + SetIsTruncated (bool t) + { + m_is_truncated = t; + return *this; + } + + bool + GetIsTruncated () const + { + return m_is_truncated; + } + + ReadBufferAndDumpToStreamOptions& SetLanguage (lldb::LanguageType l) { m_language_type = l; @@ -409,6 +423,7 @@ namespace lldb_private { uint32_t m_source_size; bool m_escape_non_printables; bool m_zero_is_terminator; + bool m_is_truncated; lldb::LanguageType m_language_type; }; Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/stringprinter/main.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/stringprinter/main.cpp?rev=252018&r1=252017&r2=252018&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/stringprinter/main.cpp (original) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/data-formatter/stringprinter/main.cpp Tue Nov 3 18:02:08 2015 @@ -13,9 +13,28 @@ int main (int argc, char const *argv[]) { std::string stdstring("Hello\t\tWorld\nI am here\t\tto say hello\n"); //%self.addTearDownHook(lambda x: x.runCmd("setting set escape-non-printables true")) const char* constcharstar = stdstring.c_str(); - return 0; //% self.assertTrue(self.frame().FindVariable('stdstring').GetSummary() == '"Hello\\t\\tWorld\\nI am here\\t\\tto say hello\\n"') + std::string longstring( +"I am a very long string; in fact I am longer than any reasonable length that a string should be; quite long indeed; oh my, so many words; so many letters; this is kind of like writing a poem; except in real life all that is happening" +" is just me producing a very very long set of words; there is text here, text there, text everywhere; it fills me with glee to see so much text; all around me it's just letters, and symbols, and other pleasant drawings that cause me" +" a large amount of joy upon visually seeing them with my eyes; well, this is now a lot of letters, but it is still not enough for the purpose of the test I want to test, so maybe I should copy and paste this a few times, you know.." +" for science, or something" + "I am a very long string; in fact I am longer than any reasonable length that a string should be; quite long indeed; oh my, so many words; so many letters; this is kind of like writing a poem; except in real life all that is happening" + " is just me producing a very very long set of words; there is text here, text there, text everywhere; it fills me with glee to see so much text; all around me it's just letters, and symbols, and other pleasant drawings that cause me" + " a large amount of joy upon visually seeing them with my eyes; well, this is now a lot of letters, but it is still not enough for the purpose of the test I want to test, so maybe I should copy and paste this a few times, you know.." + " for science, or something" + "I am a very long string; in fact I am longer than any reasonable length that a string should be; quite long indeed; oh my, so many words; so many letters; this is kind of like writing a poem; except in real life all that is happening" + " is just me producing a very very long set of words; there is text here, text there, text everywhere; it fills me with glee to see so much text; all around me it's just letters, and symbols, and other pleasant drawings that cause me" + " a large amount of joy upon visually seeing them with my eyes; well, this is now a lot of letters, but it is still not enough for the purpose of the test I want to test, so maybe I should copy and paste this a few times, you know.." + " for science, or something" + ); + const char* longconstcharstar = longstring.c_str(); + return 0; //% if self.TraceOn(): self.runCmd('frame variable') + //% self.assertTrue(self.frame().FindVariable('stdstring').GetSummary() == '"Hello\\t\\tWorld\\nI am here\\t\\tto say hello\\n"') //% self.assertTrue(self.frame().FindVariable('constcharstar').GetSummary() == '"Hello\\t\\tWorld\\nI am here\\t\\tto say hello\\n"') //% self.runCmd("setting set escape-non-printables false") //% self.assertTrue(self.frame().FindVariable('stdstring').GetSummary() == '"Hello\t\tWorld\nI am here\t\tto say hello\n"') //% self.assertTrue(self.frame().FindVariable('constcharstar').GetSummary() == '"Hello\t\tWorld\nI am here\t\tto say hello\n"') + //% self.assertTrue(self.frame().FindVariable('longstring').GetSummary().endswith('"...')) + //% self.assertTrue(self.frame().FindVariable('longconstcharstar').GetSummary().endswith('"...')) } + Modified: lldb/trunk/source/Core/ValueObject.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=252018&r1=252017&r2=252018&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObject.cpp (original) +++ lldb/trunk/source/Core/ValueObject.cpp Tue Nov 3 18:02:08 2015 @@ -1255,13 +1255,14 @@ CopyStringDataToBufferSP(const StreamStr return true; } -size_t +std::pair<size_t,bool> ValueObject::ReadPointedString (lldb::DataBufferSP& buffer_sp, Error& error, uint32_t max_length, bool honor_array, Format item_format) { + bool was_capped = false; StreamString s; ExecutionContext exe_ctx (GetExecutionContextRef()); Target* target = exe_ctx.GetTargetPtr(); @@ -1271,7 +1272,7 @@ ValueObject::ReadPointedString (lldb::Da s << "<no target to read from>"; error.SetErrorString("no target to read from"); CopyStringDataToBufferSP(s, buffer_sp); - return 0; + return {0,was_capped}; } if (max_length == 0) @@ -1317,7 +1318,7 @@ ValueObject::ReadPointedString (lldb::Da s << "<invalid address>"; error.SetErrorString("invalid address"); CopyStringDataToBufferSP(s, buffer_sp); - return 0; + return {0,was_capped}; } Address cstr_so_addr (cstr_address); @@ -1334,7 +1335,7 @@ ValueObject::ReadPointedString (lldb::Da for (size_t offset = 0; offset < bytes_read; offset++) s.Printf("%c", *data.PeekData(offset, 1)); if (capped_data) - s << "..."; + was_capped = true; } } else @@ -1386,7 +1387,7 @@ ValueObject::ReadPointedString (lldb::Da if (cstr_len_displayed >= 0) { if (capped_cstr) - s << "..."; + was_capped = true; } } } @@ -1396,7 +1397,7 @@ ValueObject::ReadPointedString (lldb::Da s << "<not a string object>"; } CopyStringDataToBufferSP(s, buffer_sp); - return total_bytes_read; + return {total_bytes_read,was_capped}; } std::pair<TypeValidatorResult, std::string> @@ -1644,17 +1645,18 @@ ValueObject::DumpPrintableRepresentation { Error error; lldb::DataBufferSP buffer_sp; - ReadPointedString(buffer_sp, - error, - 0, - (custom_format == eFormatVectorOfChar) || - (custom_format == eFormatCharArray)); + std::pair<size_t, bool> read_string = ReadPointedString(buffer_sp, + error, + 0, + (custom_format == eFormatVectorOfChar) || + (custom_format == eFormatCharArray)); lldb_private::formatters::StringPrinter::ReadBufferAndDumpToStreamOptions options(*this); options.SetData(DataExtractor(buffer_sp, lldb::eByteOrderInvalid, 8)); // none of this matters for a string - pass some defaults options.SetStream(&s); options.SetPrefixToken(0); options.SetQuote('"'); options.SetSourceSize(buffer_sp->GetByteSize()); + options.SetIsTruncated(read_string.second); formatters::StringPrinter::ReadBufferAndDumpToStream<lldb_private::formatters::StringPrinter::StringElementType::ASCII>(options); return !error.Fail(); } Modified: lldb/trunk/source/DataFormatters/StringPrinter.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/StringPrinter.cpp?rev=252018&r1=252017&r2=252018&view=diff ============================================================================== --- lldb/trunk/source/DataFormatters/StringPrinter.cpp (original) +++ lldb/trunk/source/DataFormatters/StringPrinter.cpp Tue Nov 3 18:02:08 2015 @@ -374,6 +374,8 @@ DumpUTFBufferToStream (ConversionResult stream.Printf("%c",dump_options.GetQuote()); if (dump_options.GetSuffixToken() != 0) stream.Printf("%s",dump_options.GetSuffixToken()); + if (dump_options.GetIsTruncated()) + stream.Printf("..."); return true; } @@ -421,11 +423,20 @@ StringPrinter::ReadStringAndDumpToStream return false; size_t size; + const auto max_size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); + bool is_truncated = false; if (options.GetSourceSize() == 0) - size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); + size = max_size; else if (!options.GetIgnoreMaxLength()) - size = std::min(options.GetSourceSize(),process_sp->GetTarget().GetMaximumSizeOfStringSummary()); + { + size = options.GetSourceSize(); + if (size > max_size) + { + size = max_size; + is_truncated = true; + } + } else size = options.GetSourceSize(); @@ -492,6 +503,9 @@ StringPrinter::ReadStringAndDumpToStream else if (quote != 0) options.GetStream()->Printf("%c",quote); + if (is_truncated) + options.GetStream()->Printf("..."); + return true; } @@ -527,14 +541,23 @@ ReadUTFBufferAndDumpToStream (const Stri uint32_t sourceSize = options.GetSourceSize(); bool needs_zero_terminator = options.GetNeedsZeroTermination(); + + bool is_truncated = false; + const auto max_size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); if (!sourceSize) { - sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); + sourceSize = max_size; needs_zero_terminator = true; } else if (!options.GetIgnoreMaxLength()) - sourceSize = std::min(sourceSize,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); + { + if (sourceSize > max_size) + { + sourceSize = max_size; + is_truncated = true; + } + } const int bufferSPSize = sourceSize * type_width; @@ -562,6 +585,7 @@ ReadUTFBufferAndDumpToStream (const Stri StringPrinter::ReadBufferAndDumpToStreamOptions dump_options(options); dump_options.SetData(data); dump_options.SetSourceSize(sourceSize); + dump_options.SetIsTruncated(is_truncated); return DumpUTFBufferToStream(ConvertFunction, dump_options); } Modified: lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp?rev=252018&r1=252017&r2=252018&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp (original) +++ lldb/trunk/source/Plugins/Language/CPlusPlus/LibCxx.cpp Tue Nov 3 18:02:08 2015 @@ -563,14 +563,23 @@ lldb_private::formatters::LibcxxWStringS return false; DataExtractor extractor; + + StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); + if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) - size = std::min<decltype(size)>(size, valobj.GetTargetSP()->GetMaximumSizeOfStringSummary()); + { + const auto max_size = valobj.GetTargetSP()->GetMaximumSizeOfStringSummary(); + if (size > max_size) + { + size = max_size; + options.SetIsTruncated(true); + } + } location_sp->GetPointeeData(extractor, 0, size); // std::wstring::size() is measured in 'characters', not bytes auto wchar_t_size = valobj.GetTargetSP()->GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeWChar).GetByteSize(nullptr); - StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); options.SetData(extractor); options.SetStream(&stream); options.SetPrefixToken("L"); @@ -618,12 +627,20 @@ lldb_private::formatters::LibcxxStringSu if (!location_sp) return false; + StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); + DataExtractor extractor; if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) - size = std::min<decltype(size)>(size, valobj.GetTargetSP()->GetMaximumSizeOfStringSummary()); + { + const auto max_size = valobj.GetTargetSP()->GetMaximumSizeOfStringSummary(); + if (size > max_size) + { + size = max_size; + options.SetIsTruncated(true); + } + } location_sp->GetPointeeData(extractor, 0, size); - StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); options.SetData(extractor); options.SetStream(&stream); options.SetPrefixToken(0); Modified: lldb/trunk/source/Target/Process.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=252018&r1=252017&r2=252018&view=diff ============================================================================== --- lldb/trunk/source/Target/Process.cpp (original) +++ lldb/trunk/source/Target/Process.cpp Tue Nov 3 18:02:08 2015 @@ -1960,7 +1960,7 @@ Process::LoadImage (const FileSpec &imag if (error_str_sp->IsCStringContainer(true)) { DataBufferSP buffer_sp(new DataBufferHeap(10240,0)); - size_t num_chars = error_str_sp->ReadPointedString (buffer_sp, error, 10240); + size_t num_chars = error_str_sp->ReadPointedString (buffer_sp, error, 10240).first; if (error.Success() && num_chars > 0) { error.Clear(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits