From ebb4dfd35039056d774d5c5a6ad4746a7a4479b5 Mon Sep 17 00:00:00 2001 From: Ilia K Date: Thu, 30 Apr 2015 11:08:31 +0000 Subject: [PATCH] Rework =shlibs-added/=shlibs-removed Summary: This patch includes the following: * Rename =shlibs-added/=shlibs-removed to standard =library-loaded/=library-unloaded * Remove redundant fields * Add extra symbols-loaded/symbols-path and loaded_addr fields * Rename CMICmnMIOutOfBandRecord::eOutOfBand_TargetModulesLoaded/eOutOfBand_TargetModulesUnloaded to CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded/eOutOfBand_TargetModuleUnloaded Test Plan: ./dotest.py -v --executable $BUILDDIR/bin/lldb tools/lldb-mi/ Reviewers: jasonmolenda, jingham, abidh Reviewed By: abidh Subscribers: lldb-commits, jingham, jasonmolenda, abidh Differential Revision: http://reviews.llvm.org/D9280 llvm-svn: 236225 --- lldb/test/tools/lldb-mi/TestMiLibraryLoaded.py | 33 +++++ .../lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp | 138 +++++++++++---------- lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h | 4 +- lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.cpp | 8 +- lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.h | 4 +- lldb/tools/lldb-mi/MIExtensions.txt | 11 ++ 6 files changed, 123 insertions(+), 75 deletions(-) create mode 100644 lldb/test/tools/lldb-mi/TestMiLibraryLoaded.py diff --git a/lldb/test/tools/lldb-mi/TestMiLibraryLoaded.py b/lldb/test/tools/lldb-mi/TestMiLibraryLoaded.py new file mode 100644 index 0000000..9b6173f --- /dev/null +++ b/lldb/test/tools/lldb-mi/TestMiLibraryLoaded.py @@ -0,0 +1,33 @@ +""" +Test lldb-mi =library-loaded notifications. +""" + +import lldbmi_testcase +from lldbtest import * +import unittest2 + +class MiLibraryLoadedTestCase(lldbmi_testcase.MiTestCaseBase): + + mydir = TestBase.compute_mydir(__file__) + + @lldbmi_test + @expectedFailureWindows("llvm.org/pr22274: need a pexpect replacement for windows") + @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races + def test_lldbmi_library_loaded(self): + """Test that 'lldb-mi --interpreter' shows the =library-loaded notifications.""" + + self.spawnLldbMi(args = None) + + # Load executable + self.runCmd("-file-exec-and-symbols %s" % self.myexe) + self.expect("\^done") + + # Test =library-loaded + import os + path = os.path.join(os.getcwd(), self.myexe) + symbols_path = os.path.join(path + ".dSYM", "Contents", "Resources", "DWARF", self.myexe) + self.expect("=library-loaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded=\"1\",symbols-path=\"%s\",loaded_addr=\"-\"" % (path, path, path, symbols_path), + exactly = True) + +if __name__ == '__main__': + unittest2.main() diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp b/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp index 31ece6b..43299e8 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp +++ b/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp @@ -618,114 +618,118 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBTarget(const lldb::SBEvent &vEvent) } //++ ------------------------------------------------------------------------------------ -// Details: Print to stdout "=shlibs-added,shlib-info=[key=\"value\"...]" +// Details: Print to stdout "=library-loaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" PRIx64"\"" // Type: Method. // Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. +// Return: MIstatus::success - Function succeeded. +// MIstatus::failure - Function failed. // Throws: None. //-- bool CMICmnLLDBDebuggerHandleEvents::HandleTargetEventBroadcastBitModulesLoaded(const lldb::SBEvent &vEvent) { - static MIuint s_nModulesLoadedNumber(0); - const MIuint nSize(lldb::SBTarget::GetNumModulesFromEvent(vEvent)); - bool bOk = MIstatus::success; - for (MIuint nIndex(0); bOk && (nIndex < nSize); ++nIndex) + bool bOk = MIstatus::failure; + const MIuint nSize = lldb::SBTarget::GetNumModulesFromEvent(vEvent); + for (MIuint nIndex = 0; nIndex < nSize; ++nIndex) { const lldb::SBModule sbModule = lldb::SBTarget::GetModuleAtIndexFromEvent(nIndex, vEvent); - CMICmnMIValueList miValueList(true); - bOk = MiHelpGetModuleInfo(sbModule, ++s_nModulesLoadedNumber, miValueList); - const CMICmnMIValueResult miValueResult("shlib-info", miValueList); - const CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetModulesLoaded, miValueResult); + CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded); + const bool bWithExtraFields = true; + bOk = MiHelpGetModuleInfo(sbModule, bWithExtraFields, miOutOfBandRecord); bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); + if (!bOk) + break; } return bOk; } //++ ------------------------------------------------------------------------------------ -// Details: Print to stdout "=shlibs-removed,shlib-info=[key=\"value\"...]" +// Details: Print to stdout "=library-unloaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" PRIx64"\"" // Type: Method. // Args: None. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. +// Return: MIstatus::success - Function succeeded. +// MIstatus::failure - Function failed. // Throws: None. //-- bool CMICmnLLDBDebuggerHandleEvents::HandleTargetEventBroadcastBitModulesUnloaded(const lldb::SBEvent &vEvent) { - static MIuint s_nModulesUnloadedNumber(0); - const MIuint nSize(lldb::SBTarget::GetNumModulesFromEvent(vEvent)); - bool bOk = MIstatus::success; - for (MIuint nIndex(0); bOk && (nIndex < nSize); ++nIndex) + bool bOk = MIstatus::failure; + const MIuint nSize = lldb::SBTarget::GetNumModulesFromEvent(vEvent); + for (MIuint nIndex = 0; nIndex < nSize; ++nIndex) { const lldb::SBModule sbModule = lldb::SBTarget::GetModuleAtIndexFromEvent(nIndex, vEvent); - CMICmnMIValueList miValueList(true); - bOk = MiHelpGetModuleInfo(sbModule, ++s_nModulesUnloadedNumber, miValueList); - const CMICmnMIValueResult miValueResult("shlib-info", miValueList); - const CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetModulesUnloaded, miValueResult); + CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleUnloaded); + const bool bWithExtraFields = false; + bOk = MiHelpGetModuleInfo(sbModule, bWithExtraFields, miOutOfBandRecord); bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord); + if (!bOk) + break; } return bOk; } //++ ------------------------------------------------------------------------------------ -// Details: Build module information for shlib-info "[num=\"%ld\",name=\"%s\",dyld-addr=\"%#lx\",reason=\"dyld\",path=\"%s\",loaded_addr=\"%#lx\",dsym-objpath=\"%s\"]" +// Details: Build module information for =library-loaded/=library-unloaded: "id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded="%d"[,symbols-path=\"%s\"],loaded_addr=\"0x%016" PRIx64"\"" // Type: Method. // Args: vwrMiValueList - (W) MI value list object. -// Return: MIstatus::success - Functional succeeded. -// MIstatus::failure - Functional failed. +// Return: MIstatus::success - Function succeeded. +// MIstatus::failure - Function failed. // Throws: None. //-- bool -CMICmnLLDBDebuggerHandleEvents::MiHelpGetModuleInfo(const lldb::SBModule &vModule, const MIuint nModuleNum, - CMICmnMIValueList &vwrMiValueList) +CMICmnLLDBDebuggerHandleEvents::MiHelpGetModuleInfo(const lldb::SBModule &vModule, const bool vbWithExtraFields, + CMICmnMIOutOfBandRecord &vwrMiOutOfBandRecord) { bool bOk = MIstatus::success; - // Build "num" field - const CMIUtilString strNum(CMIUtilString::Format("%ld", nModuleNum)); - const CMICmnMIValueConst miValueConst(strNum); - const CMICmnMIValueResult miValueResult("num", miValueConst); - bOk = bOk && vwrMiValueList.Add(miValueResult); - // Build "name" field - const CMICmnMIValueConst miValueConst2(vModule.GetPlatformFileSpec().GetFilename()); - const CMICmnMIValueResult miValueResult2("name", miValueConst2); - bOk = bOk && vwrMiValueList.Add(miValueResult2); - // Build "dyld-addr" field - const lldb::SBAddress sbAddress(vModule.GetObjectFileHeaderAddress()); - const CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); - const lldb::addr_t nLoadAddress(sbAddress.GetLoadAddress(rSessionInfo.GetTarget())); - const CMIUtilString strDyldAddr(CMIUtilString::Format("%#lx", nLoadAddress)); - const CMICmnMIValueConst miValueConst3(nLoadAddress != LLDB_INVALID_ADDRESS ? strDyldAddr : "-"); - const CMICmnMIValueResult miValueResult3("dyld-addr", miValueConst3); - bOk = bOk && vwrMiValueList.Add(miValueResult3); - // Build "reason" field - const CMICmnMIValueConst miValueConst4("dyld"); - const CMICmnMIValueResult miValueResult4("reason", miValueConst4); - bOk = bOk && vwrMiValueList.Add(miValueResult4); - // Build "path" field - char path[PATH_MAX]; - vModule.GetPlatformFileSpec().GetPath(path, sizeof(path)); - const CMIUtilString strPlatformPath(path); - const CMICmnMIValueConst miValueConst5(strPlatformPath); - const CMICmnMIValueResult miValueResult5("path", miValueConst5); - bOk = bOk && vwrMiValueList.Add(miValueResult5); - // Build "loaded_addr" field - const CMIUtilString strLoadedAddr(CMIUtilString::Format("%#lx", nLoadAddress)); - const CMICmnMIValueConst miValueConst6(nLoadAddress != LLDB_INVALID_ADDRESS ? strDyldAddr : "-"); - const CMICmnMIValueResult miValueResult6("loaded_addr", miValueConst6); - bOk = bOk && vwrMiValueList.Add(miValueResult6); - // Build "dsym-objpath" field - vModule.GetSymbolFileSpec().GetPath(path, sizeof(path)); - const CMIUtilString strSymbolFilePath(path); - if (!CMIUtilString::Compare(strPlatformPath, strSymbolFilePath)) + // First, build standard fields: + // Build "id" field + std::unique_ptr apPath(new char[PATH_MAX]); + vModule.GetFileSpec().GetPath(apPath.get(), PATH_MAX); + const CMIUtilString strTargetPath(apPath.get()); + const CMICmnMIValueConst miValueConst(strTargetPath); + const CMICmnMIValueResult miValueResult("id", miValueConst); + bOk = bOk && vwrMiOutOfBandRecord.Add(miValueResult); + // Build "target-name" field + const CMICmnMIValueConst miValueConst2(strTargetPath); + const CMICmnMIValueResult miValueResult2("target-name", miValueConst2); + bOk = bOk && vwrMiOutOfBandRecord.Add(miValueResult2); + // Build "host-name" field + vModule.GetPlatformFileSpec().GetPath(apPath.get(), PATH_MAX); + const CMIUtilString strHostPath(apPath.get()); + const CMICmnMIValueConst miValueConst3(strHostPath); + const CMICmnMIValueResult miValueResult3("host-name", miValueConst3); + bOk = bOk && vwrMiOutOfBandRecord.Add(miValueResult3); + + // Then build extra fields if needed: + if (vbWithExtraFields) { - const CMICmnMIValueConst miValueConst7(strSymbolFilePath); - const CMICmnMIValueResult miValueResult7("dsym-objpath", miValueConst7); - bOk = bOk && vwrMiValueList.Add(miValueResult7); + // Build "symbols-loaded" field + vModule.GetSymbolFileSpec().GetPath(apPath.get(), PATH_MAX); + const CMIUtilString strSymbolsPath(apPath.get()); + const bool bSymbolsLoaded = !CMIUtilString::Compare(strHostPath, strSymbolsPath); + const CMICmnMIValueConst miValueConst4(CMIUtilString::Format("%d", bSymbolsLoaded)); + const CMICmnMIValueResult miValueResult4("symbols-loaded", miValueConst4); + bOk = bOk && vwrMiOutOfBandRecord.Add(miValueResult4); + // Build "symbols-path" field + if (bSymbolsLoaded) + { + const CMICmnMIValueConst miValueConst5(strSymbolsPath); + const CMICmnMIValueResult miValueResult5("symbols-path", miValueConst5); + bOk = bOk && vwrMiOutOfBandRecord.Add(miValueResult5); + } + // Build "loaded_addr" field + const lldb::SBAddress sbAddress(vModule.GetObjectFileHeaderAddress()); + CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); + const lldb::addr_t nLoadAddress(sbAddress.GetLoadAddress(rSessionInfo.GetTarget())); + const CMIUtilString strLoadedAddr(nLoadAddress != LLDB_INVALID_ADDRESS ? + CMIUtilString::Format("0x%016" PRIx64, nLoadAddress) : "-"); + const CMICmnMIValueConst miValueConst6(strLoadedAddr); + const CMICmnMIValueResult miValueResult6("loaded_addr", miValueConst6); + bOk = bOk && vwrMiOutOfBandRecord.Add(miValueResult6); } return bOk; diff --git a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h b/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h index 842e5bf..00ac577 100644 --- a/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h +++ b/lldb/tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h @@ -71,8 +71,8 @@ class CMICmnLLDBDebuggerHandleEvents : public CMICmnBase, public MI::ISingleton< bool HandleProcessEventStateSuspended(const lldb::SBEvent &vEvent); bool HandleTargetEventBroadcastBitModulesLoaded(const lldb::SBEvent &vEvent); bool HandleTargetEventBroadcastBitModulesUnloaded(const lldb::SBEvent &vEvent); - bool MiHelpGetModuleInfo(const lldb::SBModule &vModule, const MIuint nModuleNum, - CMICmnMIValueList &vwrMiValueList); + bool MiHelpGetModuleInfo(const lldb::SBModule &vModule, const bool vbWithExtraFields, + CMICmnMIOutOfBandRecord &vwrMiOutOfBandRecord); bool MiHelpGetCurrentThreadFrame(CMICmnMIValueTuple &vwrMiValueTuple); bool MiResultRecordToStdout(const CMICmnMIResultRecord &vrMiResultRecord); bool MiOutOfBandRecordToStdout(const CMICmnMIOutOfBandRecord &vrMiResultRecord); diff --git a/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.cpp b/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.cpp index bb8c09e..e3689be 100644 --- a/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.cpp +++ b/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.cpp @@ -25,8 +25,8 @@ CMICmnMIOutOfBandRecord::MapOutOfBandToOutOfBandText_t ms_MapOutOfBandToOutOfBan {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated, "thread-created"}, {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, "thread-exited"}, {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, "thread-selected"}, - {CMICmnMIOutOfBandRecord::eOutOfBand_TargetModulesLoaded, "shlibs-added"}, - {CMICmnMIOutOfBandRecord::eOutOfBand_TargetModulesUnloaded, "shlibs-removed"}, + {CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded, "library-loaded"}, + {CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleUnloaded, "library-unloaded"}, {CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, ""}}; CMICmnMIOutOfBandRecord::MapOutOfBandToOutOfBandText_t ms_constMapAsyncRecordTextToToken = { {CMICmnMIOutOfBandRecord::eOutOfBand_Running, "*"}, @@ -41,8 +41,8 @@ CMICmnMIOutOfBandRecord::MapOutOfBandToOutOfBandText_t ms_constMapAsyncRecordTex {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated, "="}, {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, "="}, {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, "="}, - {CMICmnMIOutOfBandRecord::eOutOfBand_TargetModulesLoaded, "="}, - {CMICmnMIOutOfBandRecord::eOutOfBand_TargetModulesUnloaded, "="}, + {CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleLoaded, "="}, + {CMICmnMIOutOfBandRecord::eOutOfBand_TargetModuleUnloaded, "="}, {CMICmnMIOutOfBandRecord::eOutOfBand_TargetStreamOutput, "@"}}; //++ ------------------------------------------------------------------------------------ diff --git a/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.h b/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.h index b32465f..60a6716 100644 --- a/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.h +++ b/lldb/tools/lldb-mi/MICmnMIOutOfBandRecord.h @@ -62,8 +62,8 @@ class CMICmnMIOutOfBandRecord : public CMICmnBase eOutOfBand_ThreadCreated, eOutOfBand_ThreadExited, eOutOfBand_ThreadSelected, - eOutOfBand_TargetModulesLoaded, - eOutOfBand_TargetModulesUnloaded, + eOutOfBand_TargetModuleLoaded, + eOutOfBand_TargetModuleUnloaded, eOutOfBand_TargetStreamOutput, eOutOfBand_count // Always the last one }; diff --git a/lldb/tools/lldb-mi/MIExtensions.txt b/lldb/tools/lldb-mi/MIExtensions.txt index c9fb296..dec2846 100644 --- a/lldb/tools/lldb-mi/MIExtensions.txt +++ b/lldb/tools/lldb-mi/MIExtensions.txt @@ -31,3 +31,14 @@ Example: -data-info-line hello.cpp:15 ^done,start="0x0000000100000f80",end="0x0000000100000f94",file="/Users/IliaK/p/hello.cpp",line="15" + +# =library-loaded notification + +The =library-loaded notification has 3 extra fields: + symbols-loaded - indicates that there are symbols for the loaded library + symbols-path - if symbols are exist then it contains a path for symbols of the loaded library + loaded_addr - contains an address of the loaded library or "-" if address isn't resolved yet + +For example: + =library-loaded,id="/Users/IliaK/p/hello",target-name="/Users/IliaK/p/hello",host-name="/Users/IliaK/p/hello",symbols-loaded="1",symbols-path="/Users/IliaK/p/hello.dSYM/Contents/Resources/DWARF/hello",loaded_addr="-" + =library-loaded,id="/usr/lib/dyld",target-name="/usr/lib/dyld",host-name="/usr/lib/dyld",symbols-loaded="0",loaded_addr="0x00007fff5fc00000" -- 2.7.4