diff options
author | Christopher Ferris <cferris@google.com> | 2015-05-22 14:26:13 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2015-05-28 11:45:34 -0700 |
commit | 0c3f1ae66b693ef0f37066b697cc10a07ef56acc (patch) | |
tree | 2696c72439d9b049b43476cb4d96d96f9518e95e /debuggerd/test/BacktraceMock.h | |
parent | b37c45e90aa311b4d32a5b21dad5fce93c9761a7 (diff) | |
download | system_core-0c3f1ae66b693ef0f37066b697cc10a07ef56acc.zip system_core-0c3f1ae66b693ef0f37066b697cc10a07ef56acc.tar.gz system_core-0c3f1ae66b693ef0f37066b697cc10a07ef56acc.tar.bz2 |
Refactor dump_memory function.
- Add dumping memory around registers for x86/x86_64.
- Add unit tests for new dump_memory function.
- Cleanup all of the machine.cpp files.
- Increase the high address check for 32 bit, and decrease the high
address allowed for 64 bit slightly to match mips64.
Bug: 21206576
(cherry picked from commit e8bc77eb845ab5557a4c98fe0da604d4a3740bef)
Change-Id: I49ec237e30076a232f084da1072bf9aba15dc0cd
Diffstat (limited to 'debuggerd/test/BacktraceMock.h')
-rw-r--r-- | debuggerd/test/BacktraceMock.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/debuggerd/test/BacktraceMock.h b/debuggerd/test/BacktraceMock.h new file mode 100644 index 0000000..05ad12b --- /dev/null +++ b/debuggerd/test/BacktraceMock.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _DEBUGGERD_TEST_BACKTRACE_MOCK_H +#define _DEBUGGERD_TEST_BACKTRACE_MOCK_H + +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <sys/ucontext.h> + +#include <string> +#include <vector> + +#include <backtrace/Backtrace.h> +#include <backtrace/BacktraceMap.h> + +class BacktraceMapMock : public BacktraceMap { + public: + BacktraceMapMock() : BacktraceMap(0) {} + virtual ~BacktraceMapMock() {} +}; + + +class BacktraceMock : public Backtrace { + public: + BacktraceMock(BacktraceMapMock* map) : Backtrace(0, 0, map) { + if (map_ == nullptr) { + abort(); + } + } + virtual ~BacktraceMock() {} + + virtual bool Unwind(size_t, ucontext_t*) { return false; } + virtual bool ReadWord(uintptr_t, word_t*) { return false;} + + virtual std::string GetFunctionNameRaw(uintptr_t, uintptr_t*) { return ""; } + + virtual size_t Read(uintptr_t addr, uint8_t* buffer, size_t bytes) { + size_t offset = 0; + if (last_read_addr_ > 0) { + offset = addr - last_read_addr_; + } + size_t bytes_available = buffer_.size() - offset; + + if (bytes_partial_read_ > 0) { + // Do a partial read. + if (bytes > bytes_partial_read_) { + bytes = bytes_partial_read_; + } + bytes_partial_read_ -= bytes; + } else if (bytes > bytes_available) { + bytes = bytes_available; + } + + if (bytes > 0) { + memcpy(buffer, buffer_.data() + offset, bytes); + } + + last_read_addr_ = addr; + return bytes; + } + + void SetReadData(uint8_t* buffer, size_t bytes) { + buffer_.resize(bytes); + memcpy(buffer_.data(), buffer, bytes); + bytes_partial_read_ = 0; + last_read_addr_ = 0; + } + + void SetPartialReadAmount(size_t bytes) { + if (bytes > buffer_.size()) { + abort(); + } + bytes_partial_read_ = bytes; + } + + private: + std::vector<uint8_t> buffer_; + size_t bytes_partial_read_ = 0; + uintptr_t last_read_addr_ = 0; +}; + +#endif // _DEBUGGERD_TEST_BACKTRACE_MOCK_H |