diff options
-rw-r--r-- | lldb/include/lldb/API/SBProcess.h | 9 | ||||
-rw-r--r-- | lldb/include/lldb/Target/Process.h | 3 | ||||
-rw-r--r-- | lldb/scripts/Python/interface/SBProcess.i | 51 | ||||
-rw-r--r-- | lldb/source/API/SBProcess.cpp | 54 | ||||
-rw-r--r-- | lldb/source/Host/macosx/Host.mm | 14 | ||||
-rw-r--r-- | lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp | 9 | ||||
-rw-r--r-- | lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp | 9 | ||||
-rw-r--r-- | lldb/source/Target/Process.cpp | 11 |
9 files changed, 146 insertions, 17 deletions
diff --git a/lldb/include/lldb/API/SBProcess.h b/lldb/include/lldb/API/SBProcess.h index e126dbcada3..2a9e396be61 100644 --- a/lldb/include/lldb/API/SBProcess.h +++ b/lldb/include/lldb/API/SBProcess.h @@ -155,6 +155,15 @@ public: size_t WriteMemory (addr_t addr, const void *buf, size_t size, lldb::SBError &error); + size_t + ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &error); + + uint64_t + ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &error); + + lldb::addr_t + ReadPointerFromMemory (addr_t addr, lldb::SBError &error); + // Events static lldb::StateType GetStateFromEvent (const lldb::SBEvent &event); diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index 843300d0692..730422abf74 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -2373,7 +2373,8 @@ public: size_t ReadCStringFromMemory (lldb::addr_t vm_addr, char *cstr, - size_t cstr_max_len); + size_t cstr_max_len, + Error &error); size_t ReadMemoryFromInferior (lldb::addr_t vm_addr, diff --git a/lldb/scripts/Python/interface/SBProcess.i b/lldb/scripts/Python/interface/SBProcess.i index b2ab9231a26..920aefb4c80 100644 --- a/lldb/scripts/Python/interface/SBProcess.i +++ b/lldb/scripts/Python/interface/SBProcess.i @@ -208,6 +208,57 @@ public: size_t WriteMemory (addr_t addr, const void *buf, size_t size, lldb::SBError &error); + %feature("autodoc", " + Reads a NULL terminated C string from the current process's address space. + It returns a python string of the exact length, or truncates the string if + the maximum character limit is reached. Example: + + # Read a C string of at most 256 bytes from address '0x1000' + error = lldb.SBError() + cstring = process.ReadMemory(0x1000, 256, error) + if error.Success(): + print 'cstring: ', cstring + else + print 'error: ', error + ") ReadCStringFromMemory; + + size_t + ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &error); + + %feature("autodoc", " + Reads an unsigned integer from memory given a byte size and an address. + Returns the unsigned integer that was read. Example: + + # Read a 4 byte unsigned integer from address 0x1000 + error = lldb.SBError() + uint = ReadUnsignedFromMemory(0x1000, 4, error) + if error.Success(): + print 'integer: %u' % uint + else + print 'error: ', error + + ") ReadUnsignedFromMemory; + + uint64_t + ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &error); + + %feature("autodoc", " + Reads a pointer from memory from an address and returns the value. Example: + + # Read a pointer from address 0x1000 + error = lldb.SBError() + ptr = ReadPointerFromMemory(0x1000, error) + if error.Success(): + print 'pointer: 0x%x' % ptr + else + print 'error: ', error + + ") ReadPointerFromMemory; + + lldb::addr_t + ReadPointerFromMemory (addr_t addr, lldb::SBError &error); + + // Events static lldb::StateType GetStateFromEvent (const lldb::SBEvent &event); diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp index ce8109fa090..89932a37208 100644 --- a/lldb/source/API/SBProcess.cpp +++ b/lldb/source/API/SBProcess.cpp @@ -766,6 +766,60 @@ SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error } size_t +SBProcess::ReadCStringFromMemory (addr_t addr, void *buf, size_t size, lldb::SBError &sb_error) +{ + size_t bytes_read = 0; + if (m_opaque_sp) + { + Error error; + Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); + bytes_read = m_opaque_sp->ReadCStringFromMemory (addr, (char *)buf, size, error); + sb_error.SetError (error); + } + else + { + sb_error.SetErrorString ("SBProcess is invalid"); + } + return bytes_read; +} + +uint64_t +SBProcess::ReadUnsignedFromMemory (addr_t addr, uint32_t byte_size, lldb::SBError &sb_error) +{ + if (m_opaque_sp) + { + Error error; + Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); + uint64_t value = m_opaque_sp->ReadUnsignedIntegerFromMemory (addr, byte_size, 0, error); + sb_error.SetError (error); + return value; + } + else + { + sb_error.SetErrorString ("SBProcess is invalid"); + } + return 0; +} + +lldb::addr_t +SBProcess::ReadPointerFromMemory (addr_t addr, lldb::SBError &sb_error) +{ + lldb::addr_t ptr = LLDB_INVALID_ADDRESS; + if (m_opaque_sp) + { + Error error; + Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); + ptr = m_opaque_sp->ReadPointerFromMemory (addr, error); + sb_error.SetError (error); + } + else + { + sb_error.SetErrorString ("SBProcess is invalid"); + } + return ptr; +} + +size_t SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error) { size_t bytes_written = 0; diff --git a/lldb/source/Host/macosx/Host.mm b/lldb/source/Host/macosx/Host.mm index de6929d68c6..ac036e4a68b 100644 --- a/lldb/source/Host/macosx/Host.mm +++ b/lldb/source/Host/macosx/Host.mm @@ -657,7 +657,7 @@ Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) if (log) log->Printf("Sending source file: \"%s\" and line: %d to external editor.\n", file_path, line_no); - OSStatus error; + long error; BabelAESelInfo file_and_line_info = { 0, // reserved0 @@ -678,7 +678,7 @@ Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) if (error != noErr) { if (log) - log->Printf("Error creating AEDesc: %d.\n", error); + log->Printf("Error creating AEDesc: %ld.\n", error); return false; } @@ -713,7 +713,7 @@ Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) if (error != noErr) { if (log) - log->Printf("Could not find External Editor application, error: %d.\n", error); + log->Printf("Could not find External Editor application, error: %ld.\n", error); return false; } @@ -735,7 +735,7 @@ Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) if (error != noErr) { if (log) - log->Printf("LSOpenURLsWithRole failed, error: %d.\n", error); + log->Printf("LSOpenURLsWithRole failed, error: %ld.\n", error); return false; } @@ -750,7 +750,7 @@ Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) if (error != noErr) { if (log) - log->Printf("GetProcessInformation failed, error: %d.\n", error); + log->Printf("GetProcessInformation failed, error: %ld.\n", error); using_xcode = false; } else @@ -807,7 +807,7 @@ Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) if (error != noErr) { if (log) - log->Printf("Failed to create AEDesc for Xcode AppleEvent: %d.\n", error); + log->Printf("Failed to create AEDesc for Xcode AppleEvent: %ld.\n", error); return false; } @@ -825,7 +825,7 @@ Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) if (error != noErr) { if (log) - log->Printf("Sending AppleEvent to Xcode failed, error: %d.\n", error); + log->Printf("Sending AppleEvent to Xcode failed, error: %ld.\n", error); return false; } } diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp index b2b40c9d2c6..2b5efab3489 100644 --- a/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp +++ b/lldb/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp @@ -918,10 +918,13 @@ DynamicLoaderMacOSXDYLD::ReadImageInfos (lldb::addr_t image_infos_addr, image_infos[i].mod_date = info_data_ref.GetPointer(&info_data_offset); char raw_path[PATH_MAX]; - m_process->ReadCStringFromMemory (path_addr, raw_path, sizeof(raw_path)); + m_process->ReadCStringFromMemory (path_addr, raw_path, sizeof(raw_path), error); // don't resolve the path - const bool resolve_path = false; - image_infos[i].file_spec.SetFile(raw_path, resolve_path); + if (error.Success()) + { + const bool resolve_path = false; + image_infos[i].file_spec.SetFile(raw_path, resolve_path); + } } return true; } diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp index e614edf4be9..d584cb28d9e 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp @@ -145,7 +145,8 @@ AppleObjCRuntime::GetObjectDescription (Stream &strm, Value &value, ExecutionCon size_t curr_len = full_buffer_len; while (curr_len == full_buffer_len) { - curr_len = process->ReadCStringFromMemory(result_ptr + cstr_len, buf, sizeof(buf)); + Error error; + curr_len = process->ReadCStringFromMemory(result_ptr + cstr_len, buf, sizeof(buf), error); strm.Write (buf, curr_len); cstr_len += curr_len; } diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp index 5442acd4b85..ae6466803c7 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp @@ -220,10 +220,11 @@ AppleObjCRuntimeV2::RunFunctionToFindClassName(addr_t object_addr, Thread *threa } addr_t result_ptr = void_ptr_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS); - size_t chars_read = m_process->ReadCStringFromMemory (result_ptr, name_dst, max_name_len); + Error error; + size_t chars_read = m_process->ReadCStringFromMemory (result_ptr, name_dst, max_name_len, error); // If we exhausted our buffer before finding a NULL we're probably off in the weeds somewhere... - if (chars_read == max_name_len) + if (error.Fail() || chars_read == max_name_len) return false; else return true; @@ -686,8 +687,8 @@ AppleObjCRuntimeV2::GetActualTypeName(ObjCLanguageRuntime::ObjCISA isa) return g_unknown; //printf("name_pointer: %llx\n", name_pointer); - char* cstr = new char[512]; - if (m_process->ReadCStringFromMemory(name_pointer, cstr, 512) > 0) + char cstr[512]; + if (m_process->ReadCStringFromMemory(name_pointer, cstr, sizeof(cstr), error) > 0) { if (::strstr(cstr, "NSKVONotify") == cstr) { diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index a138f59f6ce..fdd6b1753c7 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -1856,11 +1856,12 @@ Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) size_t -Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len) +Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error) { size_t total_cstr_len = 0; if (dst && dst_max_len) { + result_error.Clear(); // NULL out everything just to be safe memset (dst, 0, dst_max_len); Error error; @@ -1877,6 +1878,7 @@ Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len) if (bytes_read == 0) { + result_error = error; dst[total_cstr_len] = '\0'; break; } @@ -1892,6 +1894,13 @@ Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len) bytes_left -= bytes_read; } } + else + { + if (dst == NULL) + result_error.SetErrorString("invalid arguments"); + else + result_error.Clear(); + } return total_cstr_len; } |