diff --git a/MemoryCrawler/CMakeLists.txt b/MemoryCrawler/CMakeLists.txt new file mode 100644 index 0000000..6fcca7e --- /dev/null +++ b/MemoryCrawler/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.1) + +include( CheckCXXCompilerFlag ) +check_cxx_compiler_flag( "-std=c++11" COMPILER_SUPPORTS_CXX11 ) +check_cxx_compiler_flag( "-std=c++0x" COMPILER_SUPPORTS_CXX0X ) + +if( COMPILER_SUPPORTS_CXX11 ) + if( CMAKE_COMPILER_IS_GNUCXX ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11" ) + else() + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" ) + endif() +elseif( COMPILER_SUPPORTS_CXX0X) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x" ) +else() + # MSVC, On by default (if available) +endif() + +set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}) + +set(MEMORYPROFILE_INSTALL_BIN_DIR ${PROJECT_SOURCE_DIR}/bin) +set(MEMORYPROFILE_INSTALL_LIB_DIR ${PROJECT_SOURCE_DIR}/lib) +set(MEMORYPROFILE_CRAWLER_DIR ${PROJECT_SOURCE_DIR}/MemoryCrawler) + +add_subdirectory(MemoryCrawler) +add_subdirectory(UnityProfiler) \ No newline at end of file diff --git a/MemoryCrawler/MemoryCrawler/CMakeLists.txt b/MemoryCrawler/MemoryCrawler/CMakeLists.txt new file mode 100644 index 0000000..89f210e --- /dev/null +++ b/MemoryCrawler/MemoryCrawler/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.2) +#project(MemoryCrawler) + +aux_source_directory(Crawler CRAWLER_DIR_SRCS) + +#set(SOURCE_FILES main.cpp ${CRAWLER_DIR_SRCS}) + +add_executable(MemoryCrawler main.cpp ${CRAWLER_DIR_SRCS}) + +#target_include_directories(MemoryCrawler PUBLIC ${MEMORYPROFILE_INSTALL_INCLUDE_DIR}) + +find_library(LIB_SQLLITE sqlite3) + +target_link_libraries(MemoryCrawler ${LIB_SQLLITE}) + +install(TARGETS MemoryCrawler DESTINATION ${MEMORYPROFILE_INSTALL_BIN_DIR}) diff --git a/MemoryCrawler/MemoryCrawler/Crawler/MD5.cpp b/MemoryCrawler/MemoryCrawler/Crawler/MD5.cpp new file mode 100644 index 0000000..ac55ec8 --- /dev/null +++ b/MemoryCrawler/MemoryCrawler/Crawler/MD5.cpp @@ -0,0 +1,361 @@ +// +// Created by pluswu on 2019/6/6. +// + +/* MD5 + converted to C++ class by Frank Thilo (thilo@unix-ag.org) + for bzflag (http://www.bzflag.org) + + based on: + + md5.h and md5.c + reference implemantion of RFC 1321 + + Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All +rights reserved. + +License to copy and use this software is granted provided that it +is identified as the "RSA Data Security, Inc. MD5 Message-Digest +Algorithm" in all material mentioning or referencing this software +or this function. + +License is also granted to make and use derivative works provided +that such works are identified as "derived from the RSA Data +Security, Inc. MD5 Message-Digest Algorithm" in all material +mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either +the merchantability of this software or the suitability of this +software for any particular purpose. It is provided "as is" +without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this +documentation and/or software. + +*/ + +/* interface header */ +#include "md5.h" + +/* system implementation headers */ +#include +#include +#include +#include + +// Constants for MD5Transform routine. +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +/////////////////////////////////////////////// + +// F, G, H and I are basic MD5 functions. +inline MD5::uint4 MD5::F(uint4 x, uint4 y, uint4 z) { + return x&y | ~x&z; +} + +inline MD5::uint4 MD5::G(uint4 x, uint4 y, uint4 z) { + return x&z | y&~z; +} + +inline MD5::uint4 MD5::H(uint4 x, uint4 y, uint4 z) { + return x^y^z; +} + +inline MD5::uint4 MD5::I(uint4 x, uint4 y, uint4 z) { + return y ^ (x | ~z); +} + +// rotate_left rotates x left n bits. +inline MD5::uint4 MD5::rotate_left(uint4 x, int n) { + return (x << n) | (x >> (32-n)); +} + +// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. +// Rotation is separate from addition to prevent recomputation. +inline void MD5::FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a+ F(b,c,d) + x + ac, s) + b; +} + +inline void MD5::GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + G(b,c,d) + x + ac, s) + b; +} + +inline void MD5::HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + H(b,c,d) + x + ac, s) + b; +} + +inline void MD5::II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) { + a = rotate_left(a + I(b,c,d) + x + ac, s) + b; +} + +////////////////////////////////////////////// + +// default ctor, just initailize +MD5::MD5() +{ + init(); +} + +////////////////////////////////////////////// + +// nifty shortcut ctor, compute MD5 for string and finalize it right away +MD5::MD5(const std::string &text) +{ + init(); + update(text.c_str(), text.length()); + finalize(); +} + +////////////////////////////// + +void MD5::init() +{ + finalized=false; + + count[0] = 0; + count[1] = 0; + + // load magic initialization constants. + state[0] = 0x67452301; + state[1] = 0xefcdab89; + state[2] = 0x98badcfe; + state[3] = 0x10325476; +} + +////////////////////////////// + +// decodes input (unsigned char) into output (uint4). Assumes len is a multiple of 4. +void MD5::decode(uint4 output[], const uint1 input[], size_type len) +{ + for (unsigned int i = 0, j = 0; j < len; i++, j += 4) + output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) | + (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24); +} + +////////////////////////////// + +// encodes input (uint4) into output (unsigned char). Assumes len is +// a multiple of 4. +void MD5::encode(uint1 output[], const uint4 input[], size_type len) +{ + for (size_type i = 0, j = 0; j < len; i++, j += 4) { + output[j] = input[i] & 0xff; + output[j+1] = (input[i] >> 8) & 0xff; + output[j+2] = (input[i] >> 16) & 0xff; + output[j+3] = (input[i] >> 24) & 0xff; + } +} + +////////////////////////////// + +// apply MD5 algo on a block +void MD5::transform(const uint1 block[blocksize]) +{ + uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; + decode (x, block, blocksize); + + /* Round 1 */ + FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ + FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ + FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ + FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ + FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ + FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ + FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ + FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ + FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ + FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ + FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ + FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ + FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ + FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ + FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ + FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ + + /* Round 2 */ + GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ + GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ + GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ + GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ + GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ + GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ + GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ + GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ + GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ + GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ + GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ + GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ + GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ + GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ + GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ + GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ + + /* Round 3 */ + HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ + HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ + HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ + HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ + HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ + HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ + HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ + HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ + HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ + HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ + HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ + HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ + HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ + HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ + HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ + HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ + + /* Round 4 */ + II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ + II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ + II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ + II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ + II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ + II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ + II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ + II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ + II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ + II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ + II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ + II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ + II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ + II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ + II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ + II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + + // Zeroize sensitive information. + memset(x, 0, sizeof x); +} + +////////////////////////////// + +// MD5 block update operation. Continues an MD5 message-digest +// operation, processing another message block +void MD5::update(const unsigned char input[], size_type length) +{ + // compute number of bytes mod 64 + size_type index = count[0] / 8 % blocksize; + + // Update number of bits + if ((count[0] += (length << 3)) < (length << 3)) + count[1]++; + count[1] += (length >> 29); + + // number of bytes we need to fill in buffer + size_type firstpart = 64 - index; + + size_type i; + + // transform as many times as possible. + if (length >= firstpart) + { + // fill buffer first, transform + memcpy(&buffer[index], input, firstpart); + transform(buffer); + + // transform chunks of blocksize (64 bytes) + for (i = firstpart; i + blocksize <= length; i += blocksize) + transform(&input[i]); + + index = 0; + } + else + i = 0; + + // buffer remaining input + memcpy(&buffer[index], &input[i], length-i); +} + +////////////////////////////// + +// for convenience provide a verson with signed char +void MD5::update(const char input[], size_type length) +{ + update((const unsigned char*)input, length); +} + +////////////////////////////// + +// MD5 finalization. Ends an MD5 message-digest operation, writing the +// the message digest and zeroizing the context. +MD5& MD5::finalize() +{ + static unsigned char padding[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + if (!finalized) { + // Save number of bits + unsigned char bits[8]; + encode(bits, count, 8); + + // pad out to 56 mod 64. + size_type index = count[0] / 8 % 64; + size_type padLen = (index < 56) ? (56 - index) : (120 - index); + update(padding, padLen); + + // Append length (before padding) + update(bits, 8); + + // Store state in digest + encode(digest, state, 16); + + // Zeroize sensitive information. + memset(buffer, 0, sizeof buffer); + memset(count, 0, sizeof count); + + finalized=true; + } + + return *this; +} + +////////////////////////////// + +// return hex representation of digest as string +std::string MD5::hexdigest() const +{ + if (!finalized) + return ""; + + char buf[33]; + for (int i=0; i<16; i++) + sprintf(buf+i*2, "%02x", digest[i]); + buf[32]=0; + + return std::string(buf); +} + +////////////////////////////// + +std::ostream& operator<<(std::ostream& out, MD5 md5) +{ + return out << md5.hexdigest(); +} + +////////////////////////////// diff --git a/MemoryCrawler/MemoryCrawler/Crawler/MD5.h b/MemoryCrawler/MemoryCrawler/Crawler/MD5.h new file mode 100644 index 0000000..094500c --- /dev/null +++ b/MemoryCrawler/MemoryCrawler/Crawler/MD5.h @@ -0,0 +1,53 @@ +// +// Created by pluswu on 2019/6/6. +// + +#ifndef MEMORYCRAWLER_MD5_H +#define MEMORYCRAWLER_MD5_H + +#include + +class MD5 +{ +public: + typedef unsigned int size_type; // must be 32bit + + MD5(); + MD5(const std::string& text); + void update(const unsigned char *buf, size_type length); + void update(const char *buf, size_type length); + MD5& finalize(); + + std::string hexdigest() const; + + friend std::ostream& operator<<(std::ostream&, MD5 md5); + +private: + void init(); + typedef unsigned char uint1; // 8bit + typedef unsigned int uint4; // 32bit + enum {blocksize = 64}; // VC6 won't eat a const static int here + + void transform(const uint1 block[blocksize]); + static void decode(uint4 output[], const uint1 input[], size_type len); + static void encode(uint1 output[], const uint4 input[], size_type len); + + bool finalized; + uint1 buffer[blocksize]; // bytes that didn't fit in last 64 byte chunk + uint4 count[2]; // 64bit counter for number of bits (lo, hi) + uint4 state[4]; // digest so far + uint1 digest[16]; // the result + + // low level logic operations + static inline uint4 F(uint4 x, uint4 y, uint4 z); + static inline uint4 G(uint4 x, uint4 y, uint4 z); + static inline uint4 H(uint4 x, uint4 y, uint4 z); + static inline uint4 I(uint4 x, uint4 y, uint4 z); + static inline uint4 rotate_left(uint4 x, int n); + static inline void FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); + static inline void II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac); +}; + +#endif //MEMORYCRAWLER_MD5_H diff --git a/MemoryCrawler/MemoryCrawler/Crawler/crawler.cpp b/MemoryCrawler/MemoryCrawler/Crawler/crawler.cpp index 12111e4..f19f31f 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/crawler.cpp +++ b/MemoryCrawler/MemoryCrawler/Crawler/crawler.cpp @@ -7,6 +7,7 @@ // #include "crawler.h" +#include MemorySnapshotCrawler::MemorySnapshotCrawler(const char *filepath) { diff --git a/MemoryCrawler/MemoryCrawler/Crawler/heap.cpp b/MemoryCrawler/MemoryCrawler/Crawler/heap.cpp index 0782b35..63e028a 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/heap.cpp +++ b/MemoryCrawler/MemoryCrawler/Crawler/heap.cpp @@ -8,6 +8,7 @@ #include "heap.h" #include +#include int32_t HeapMemoryReader::seekOffset(address_t address) { diff --git a/MemoryCrawler/MemoryCrawler/Crawler/perf.h b/MemoryCrawler/MemoryCrawler/Crawler/perf.h index 12d02ae..0f8cd7a 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/perf.h +++ b/MemoryCrawler/MemoryCrawler/Crawler/perf.h @@ -13,8 +13,10 @@ #include #include #include +#include #include "types.h" + using std::vector; using std::string; using std::map; diff --git a/MemoryCrawler/MemoryCrawler/Crawler/serialize.cpp b/MemoryCrawler/MemoryCrawler/Crawler/serialize.cpp index 5171043..5f1cf78 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/serialize.cpp +++ b/MemoryCrawler/MemoryCrawler/Crawler/serialize.cpp @@ -8,6 +8,7 @@ #include "serialize.h" #include +#include MemorySnapshotReader::MemorySnapshotReader(const char *filepath) { @@ -30,7 +31,7 @@ PackedMemorySnapshot &MemorySnapshotReader::read(PackedMemorySnapshot &snapshot) } else { - __fs->seek(0, seekdir_t::beg); + __fs->seek(0, std::ios_base::beg); } __sampler.begin("read_header"); diff --git a/MemoryCrawler/MemoryCrawler/Crawler/stat.cpp b/MemoryCrawler/MemoryCrawler/Crawler/stat.cpp index 006cff9..274152a 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/stat.cpp +++ b/MemoryCrawler/MemoryCrawler/Crawler/stat.cpp @@ -7,6 +7,7 @@ // #include "stat.h" +#include using std::pair; void TrackStatistics::collect(int32_t itemIndex, int32_t typeIndex, int32_t size) diff --git a/MemoryCrawler/MemoryCrawler/Crawler/stat.h b/MemoryCrawler/MemoryCrawler/Crawler/stat.h index e83c540..24bf823 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/stat.h +++ b/MemoryCrawler/MemoryCrawler/Crawler/stat.h @@ -14,7 +14,7 @@ #include #include - +#include template class Statistics { @@ -59,37 +59,36 @@ void Statistics::collect(T sample) template void Statistics::summarize() { - T sum = 0; - - minimum = __samples[0]; - maximum = 0; - for (auto iter = __samples.begin(); iter != __samples.end(); iter++) - { - auto v = *iter; - sum += v; - if (v > maximum) {maximum = v;} - if (v < minimum) {minimum = v;} - } - - mean = (double)sum / (double)__samples.size(); - - double variance = 0; - for (auto iter = __samples.begin(); iter != __samples.end(); iter++) - { - variance += pow((double)*iter - mean, 2); - } - - standardDeviation = pow(variance / (double)(__samples.size() - 1), 0.5); - auto upper = mean + 3 * standardDeviation; - auto lower = mean - 3 * standardDeviation; - - reasonableMaximum = minimum; - reasonableMinimum = maximum; - for (auto iter = __samples.begin(); iter != __samples.end(); iter++) - { - auto v = *iter; - if (v > reasonableMaximum && v <= upper) {reasonableMaximum = v;} - if (v < reasonableMinimum && v >= lower) {reasonableMinimum = v;} + if (!__samples.empty()) { + T sum = 0; + minimum = __samples[0]; + maximum = 0; + for (auto iter = __samples.begin(); iter != __samples.end(); iter++) { + auto v = *iter; + sum += v; + if (v > maximum) { maximum = v; } + if (minimum == 0) + if (v < minimum) { minimum = v; } + } + + mean = (double) sum / (double) __samples.size(); + + double variance = 0; + for (auto iter = __samples.begin(); iter != __samples.end(); iter++) { + variance += pow((double) *iter - mean, 2); + } + + standardDeviation = pow(variance / (double) (__samples.size() - 1), 0.5); + auto upper = mean + 3 * standardDeviation; + auto lower = mean - 3 * standardDeviation; + + reasonableMaximum = minimum; + reasonableMinimum = maximum; + for (auto iter = __samples.begin(); iter != __samples.end(); iter++) { + auto v = *iter; + if (v > reasonableMaximum && v <= upper) { reasonableMaximum = v; } + if (v < reasonableMinimum && v >= lower) { reasonableMinimum = v; } + } } } diff --git a/MemoryCrawler/MemoryCrawler/Crawler/stream.cpp b/MemoryCrawler/MemoryCrawler/Crawler/stream.cpp index e96396b..0f7ea15 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/stream.cpp +++ b/MemoryCrawler/MemoryCrawler/Crawler/stream.cpp @@ -23,7 +23,7 @@ void FileStream::open(const char* filepath, bool memoryCache) { ifstream fs; fs.open(filepath, ifstream::in | ifstream::binary); - fs.seekg(0, seekdir_t::end); + fs.seekg(0, std::ios_base::end); auto length = fs.tellg(); char *bytes = new char[length]; diff --git a/MemoryCrawler/MemoryCrawler/Crawler/types.cpp b/MemoryCrawler/MemoryCrawler/Crawler/types.cpp index 7efd9b2..c2f57df 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/types.cpp +++ b/MemoryCrawler/MemoryCrawler/Crawler/types.cpp @@ -7,22 +7,15 @@ // #include "types.h" +#include "MD5.h" const char HashCaculator::__hex_map[] = "0123456789abcdef"; -size_t HashCaculator::get(const char *data, const CC_LONG size) +size_t HashCaculator::get(const char *data, size_t size) { - CC_MD5(data, size, __digest); - - char *ptr = __hexdigest; - auto *end = __digest + 16; - for (auto i = __digest; i != end; i++) - { - auto v = *i; - *ptr++ = __hex_map[v >> 4]; - *ptr++ = __hex_map[v & 0xF]; - } - *ptr = 0; - - return __hash(__hexdigest); + MD5 md5; + md5.update(data, size); + md5.finalize(); + + return __hash(md5.hexdigest()); } diff --git a/MemoryCrawler/MemoryCrawler/Crawler/types.h b/MemoryCrawler/MemoryCrawler/Crawler/types.h index cee65a4..44ecd6d 100644 --- a/MemoryCrawler/MemoryCrawler/Crawler/types.h +++ b/MemoryCrawler/MemoryCrawler/Crawler/types.h @@ -10,6 +10,7 @@ #define types_h #include #include +#include using byte_t = unsigned char; using address_t = int64_t; @@ -17,7 +18,6 @@ using seekdir_t = std::ios_base::seekdir; using unicode_t = std::u16string; using std::string; -#include class HashCaculator { @@ -27,7 +27,7 @@ class HashCaculator char __hexdigest[33]; std::hash __hash; public: - size_t get(const char *data, const CC_LONG size); + size_t get(const char *data, const size_t size); }; template diff --git a/MemoryCrawler/MemoryCrawler/utils.cpp b/MemoryCrawler/MemoryCrawler/Crawler/utils.cpp similarity index 99% rename from MemoryCrawler/MemoryCrawler/utils.cpp rename to MemoryCrawler/MemoryCrawler/Crawler/utils.cpp index 25cf97b..2a47481 100644 --- a/MemoryCrawler/MemoryCrawler/utils.cpp +++ b/MemoryCrawler/MemoryCrawler/Crawler/utils.cpp @@ -8,6 +8,7 @@ #include "utils.h" #include +#include char __help_padding[64]; diff --git a/MemoryCrawler/MemoryCrawler/utils.h b/MemoryCrawler/MemoryCrawler/Crawler/utils.h similarity index 97% rename from MemoryCrawler/MemoryCrawler/utils.h rename to MemoryCrawler/MemoryCrawler/Crawler/utils.h index 9858370..eac473b 100644 --- a/MemoryCrawler/MemoryCrawler/utils.h +++ b/MemoryCrawler/MemoryCrawler/Crawler/utils.h @@ -11,6 +11,7 @@ #include #include +#include bool strbeg(const char *str, const char *cmp); void readCommandOptions(const char *command, std::function &)> callback); diff --git a/MemoryCrawler/MemoryCrawler/main.cpp b/MemoryCrawler/MemoryCrawler/main.cpp index 12b35b6..d552136 100644 --- a/MemoryCrawler/MemoryCrawler/main.cpp +++ b/MemoryCrawler/MemoryCrawler/main.cpp @@ -16,7 +16,7 @@ #include "Crawler/crawler.h" #include "Crawler/cache.h" #include "Crawler/leak.h" -#include "utils.h" +#include "Crawler/utils.h" using std::cout; using std::endl; diff --git a/MemoryCrawler/UnityProfiler/CMakeLists.txt b/MemoryCrawler/UnityProfiler/CMakeLists.txt new file mode 100644 index 0000000..f3b1c14 --- /dev/null +++ b/MemoryCrawler/UnityProfiler/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.2) + +aux_source_directory(${MEMORYPROFILE_CRAWLER_DIR}/Crawler CRAWLER_DIR_SRCS) + +#set(SOURCE_FILES main.cpp record.cpp ${CRAWLER_DIR_SRCS}) + +add_executable(UnityProfiler main.cpp Crawler/record.cpp ${CRAWLER_DIR_SRCS}) + +target_include_directories(UnityProfiler PUBLIC ${MEMORYPROFILE_INSTALL_INCLUDE_DIR} ${MEMORYPROFILE_CRAWLER_DIR} ${MEMORYPROFILE_CRAWLER_DIR}/Crawler) + +find_library(LIB_SQLLITE sqlite3) + +target_link_libraries(UnityProfiler ${LIB_SQLLITE}) + +install(TARGETS UnityProfiler DESTINATION ${MEMORYPROFILE_INSTALL_BIN_DIR}) \ No newline at end of file diff --git a/MemoryCrawler/UnityProfiler/Crawler/record.cpp b/MemoryCrawler/UnityProfiler/Crawler/record.cpp index 61c51d9..d30ba4e 100644 --- a/MemoryCrawler/UnityProfiler/Crawler/record.cpp +++ b/MemoryCrawler/UnityProfiler/Crawler/record.cpp @@ -7,6 +7,7 @@ // #include "record.h" +#include RecordCrawler::RecordCrawler() { @@ -29,7 +30,7 @@ void RecordCrawler::load(const char *filepath) readStrings(); - __fs.seek(__dataOffset, seekdir_t::beg); + __fs.seek(__dataOffset, std::ios_base::beg); crawl(); @@ -158,7 +159,7 @@ void RecordCrawler::findFramesWithFPS(float fps, std::function callback, bool clearProgress) { auto &frame = __frames[__lowerFrameIndex - std::get<0>(__range)]; - __fs.seek(frame.offset, seekdir_t::beg); + __fs.seek(frame.offset, std::ios_base::beg); auto frameCount = __upperFrameIndex - __lowerFrameIndex; @@ -175,7 +176,7 @@ void RecordCrawler::iterateSamples(std::function __fs.ignore(__statsize); - readFrameSamples([&](auto &samples, auto &relations) + readFrameSamples([&](std::vector &samples, std::map > &relations) { for (auto i = 0; i < samples.size(); i++) { @@ -220,7 +221,7 @@ void RecordCrawler::statByFunction(int32_t rank) totalTime += sample.selfTime; }); - std::sort(functions.begin(), functions.end(), [&](auto a, auto b) + std::sort(functions.begin(), functions.end(), [&](int32_t a, int32_t b) { return timeStat.at(a) > timeStat.at(b); }); @@ -342,7 +343,7 @@ void RecordCrawler::findFramesWithAlloc(int32_t frameOffset, int32_t frameCount) auto baseIndex = std::get<0>(__range); auto frameIndex = __lowerFrameIndex + frameOffset; - __fs.seek(__frames[frameIndex - baseIndex].offset, seekdir_t::beg); + __fs.seek(__frames[frameIndex - baseIndex].offset, std::ios_base::beg); int32_t iterCount = 0; @@ -363,7 +364,7 @@ void RecordCrawler::findFramesWithAlloc(int32_t frameOffset, int32_t frameCount) __fs.ignore(__statsize); auto alloc = 0; - readFrameSamples([&](auto &samples, auto &relations) + readFrameSamples([&](std::vector &samples, std::map > &relations) { for (auto i = 0; i < samples.size(); i++) { @@ -403,7 +404,7 @@ void RecordCrawler::readStrings() { __sampler.begin("RecordCrawler::loadStrings"); __sampler.begin("seek"); - __fs.seek(__strOffset, seekdir_t::beg); + __fs.seek(__strOffset, std::ios_base::beg); __sampler.end(); __sampler.begin("read"); auto count = __fs.readUInt32(); @@ -501,8 +502,8 @@ void RecordCrawler::inspectFrame(int32_t frameIndex, int32_t depth) auto &frame = __frames[__cursor - std::get<0>(__range)]; - __fs.seek(frame.offset + 12 + __statsize, seekdir_t::beg); - readFrameSamples([&](auto &samples, auto &relations) + __fs.seek(frame.offset + 12 + __statsize, std::ios_base::beg); + readFrameSamples([&](std::vector &samples, std::map > & relations) { int32_t alloc = 0; for (auto i = samples.begin(); i != samples.end(); i++) diff --git a/MemoryCrawler/UnityProfiler/Crawler/record.h b/MemoryCrawler/UnityProfiler/Crawler/record.h index 9290c0b..b9eed9c 100644 --- a/MemoryCrawler/UnityProfiler/Crawler/record.h +++ b/MemoryCrawler/UnityProfiler/Crawler/record.h @@ -14,6 +14,7 @@ #include #include #include +#include #include "stream.h" #include "crawler.h" diff --git a/MemoryCrawler/UnityProfiler/main.cpp b/MemoryCrawler/UnityProfiler/main.cpp index 6c4d626..bcae4d1 100644 --- a/MemoryCrawler/UnityProfiler/main.cpp +++ b/MemoryCrawler/UnityProfiler/main.cpp @@ -217,20 +217,20 @@ void processRecord(const char *filepath) auto sign = options[2]; if (strbeg(sign, "=")) { - crawler.findFramesWithFPS(fps, [](auto a, auto b) { return a == b; }); + crawler.findFramesWithFPS(fps, [](float a, float b) { return a == b; }); } else if (strbeg(sign, "<")) { - crawler.findFramesWithFPS(fps, [](auto a, auto b) { return a < b; }); + crawler.findFramesWithFPS(fps, [](float a, float b) { return a < b; }); } else { - crawler.findFramesWithFPS(fps, [](auto a, auto b) { return a > b; }); + crawler.findFramesWithFPS(fps, [](float a, float b) { return a > b; }); } } else { - crawler.findFramesWithFPS(fps, [](auto a, auto b) { return a < b; }); + crawler.findFramesWithFPS(fps, [](float a, float b) { return a < b; }); } } });