From 5e3251f0d2d32eaf7a12cfadda8e4281ee6bc799 Mon Sep 17 00:00:00 2001 From: "guanchu.shen" Date: Fri, 20 Aug 2021 14:05:10 +0800 Subject: [PATCH] format thread-leak native code to google style --- koom-thread-leak/src/main/cpp/CMakeLists.txt | 2 +- .../src/main/cpp/src/common/callstack.cpp | 56 ++++++------- .../src/main/cpp/src/common/looper.cpp | 37 +++++---- .../cpp/src/{ => include}/common/callstack.h | 28 +++---- .../cpp/src/{ => include}/common/constant.h | 14 ++-- .../main/cpp/src/{ => include}/common/log.h | 8 +- .../cpp/src/{ => include}/common/looper.h | 6 +- .../main/cpp/src/{ => include}/common/util.h | 40 +++++----- .../src/main/cpp/src/{ => include}/koom.h | 10 +-- .../src/{ => include}/thread/hook_looper.h | 13 +-- .../cpp/src/{ => include}/thread/loop_item.h | 38 ++++----- .../src/{ => include}/thread/thread_holder.h | 33 ++++---- .../src/{ => include}/thread/thread_hook.h | 29 +++---- .../src/{ => include}/thread/thread_item.h | 13 ++- .../src/main/cpp/src/jni_bridge.cpp | 45 +++++------ koom-thread-leak/src/main/cpp/src/koom.cpp | 28 ++++--- .../src/main/cpp/src/thread/hook_looper.cpp | 25 +++--- .../src/main/cpp/src/thread/thread_holder.cpp | 10 +-- .../src/main/cpp/src/thread/thread_hook.cpp | 80 +++++++++---------- .../src/main/cpp/src/thread/thread_item.cpp | 4 +- 20 files changed, 255 insertions(+), 264 deletions(-) rename koom-thread-leak/src/main/cpp/src/{ => include}/common/callstack.h (80%) rename koom-thread-leak/src/main/cpp/src/{ => include}/common/constant.h (70%) rename koom-thread-leak/src/main/cpp/src/{ => include}/common/log.h (88%) rename koom-thread-leak/src/main/cpp/src/{ => include}/common/looper.h (84%) rename koom-thread-leak/src/main/cpp/src/{ => include}/common/util.h (73%) rename koom-thread-leak/src/main/cpp/src/{ => include}/koom.h (83%) rename koom-thread-leak/src/main/cpp/src/{ => include}/thread/hook_looper.h (74%) rename koom-thread-leak/src/main/cpp/src/{ => include}/thread/loop_item.h (71%) rename koom-thread-leak/src/main/cpp/src/{ => include}/thread/thread_holder.h (61%) rename koom-thread-leak/src/main/cpp/src/{ => include}/thread/thread_hook.h (77%) rename koom-thread-leak/src/main/cpp/src/{ => include}/thread/thread_item.h (78%) diff --git a/koom-thread-leak/src/main/cpp/CMakeLists.txt b/koom-thread-leak/src/main/cpp/CMakeLists.txt index f307576a..583fb707 100644 --- a/koom-thread-leak/src/main/cpp/CMakeLists.txt +++ b/koom-thread-leak/src/main/cpp/CMakeLists.txt @@ -13,7 +13,7 @@ project(${TARGET}) cmake_minimum_required(VERSION 3.4.1) include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/include/ + ${CMAKE_CURRENT_SOURCE_DIR}/src/include/ ${KWAI_ANDROID_BASE_DIR}/src/main/cpp/include/ ${KWAI_ANDROID_BASE_DIR}/src/main/cpp/liblog/include/ ${THIRD_PARTY_DIR}/xhook/src/main/cpp/xhook/src/ diff --git a/koom-thread-leak/src/main/cpp/src/common/callstack.cpp b/koom-thread-leak/src/main/cpp/src/common/callstack.cpp index f6a99664..a81de46a 100644 --- a/koom-thread-leak/src/main/cpp/src/common/callstack.cpp +++ b/koom-thread-leak/src/main/cpp/src/common/callstack.cpp @@ -17,17 +17,19 @@ * */ -#include +#include + +#include +#include #include -#include "callstack.h" -#include "bionic/tls_defines.h" -#include "bionic/tls.h" +#include + +#include namespace koom { const char *callstack_tag = "koom-callstack"; -//静态变量初始化 pthread_key_t CallStack::pthread_key_self; dump_java_stack_above_o_ptr CallStack::dump_java_stack_above_o; dump_java_stack_ptr CallStack::dump_java_stack; @@ -41,25 +43,27 @@ std::atomic CallStack::inSymbolize; unwindstack::UnwinderFromPid *CallStack::unwinder; void CallStack::Init() { - if (koom::Util::AndroidApi() < __ANDROID_API_L__) { koom::Log::error(callstack_tag, "android api < __ANDROID_API_L__"); return; } - void *handle = kwai::linker::DlFcn::dlopen("libart.so", RTLD_LAZY | RTLD_LOCAL); + void *handle = + kwai::linker::DlFcn::dlopen("libart.so", RTLD_LAZY | RTLD_LOCAL); if (koom::Util::AndroidApi() >= __ANDROID_API_O__) { - dump_java_stack_above_o = reinterpret_cast( - kwai::linker::DlFcn::dlsym(handle, - "_ZNK3art6Thread13DumpJavaStackERNSt3__113basic_ostreamIcNS1_11char_" - "traitsIcEEEEbb")); + dump_java_stack_above_o = reinterpret_cast< + dump_java_stack_above_o_ptr>(kwai::linker::DlFcn::dlsym( + handle, + "_ZNK3art6Thread13DumpJavaStackERNSt3__113basic_ostreamIcNS1_11char_" + "traitsIcEEEEbb")); if (dump_java_stack_above_o == nullptr) { koom::Log::error(callstack_tag, "dump_java_stack_above_o is null"); } } else if (koom::Util::AndroidApi() >= __ANDROID_API_L__) { - dump_java_stack = reinterpret_cast( - kwai::linker::DlFcn::dlsym(handle, - "_ZNK3art6Thread13DumpJavaStackERNSt3__113basic_ostreamIcNS1_11char_" - "traitsIcEEEE")); + dump_java_stack = reinterpret_cast< + dump_java_stack_ptr>(kwai::linker::DlFcn::dlsym( + handle, + "_ZNK3art6Thread13DumpJavaStackERNSt3__113basic_ostreamIcNS1_11char_" + "traitsIcEEEE")); if (dump_java_stack == nullptr) { koom::Log::error(callstack_tag, "dump_java_stack is null"); } @@ -67,8 +71,8 @@ void CallStack::Init() { if (koom::Util::AndroidApi() < __ANDROID_API_N__) { auto *pthread_key_self_art = - (pthread_key_t *) kwai::linker::DlFcn::dlsym(handle, - "_ZN3art6Thread17pthread_key_self_E"); + reinterpret_cast(kwai::linker::DlFcn::dlsym( + handle, "_ZN3art6Thread17pthread_key_self_E")); if (pthread_key_self_art != nullptr) { pthread_key_self = reinterpret_cast(*pthread_key_self_art); } else { @@ -95,9 +99,8 @@ void CallStack::JavaStackTrace(void *thread, std::ostream &os) { os << "no java stack when dumping"; return; } - if(dumpJavaLock.try_lock()) { + if (dumpJavaLock.try_lock()) { if (koom::Util::AndroidApi() >= __ANDROID_API_O__) { - //不dump locks,有稳定性问题 dump_java_stack_above_o(thread, os, true, false); } else if (koom::Util::AndroidApi() >= __ANDROID_API_L__) { dump_java_stack(thread, os); @@ -118,8 +121,9 @@ std::string CallStack::SymbolizePc(uintptr_t pc, int index) { inSymbolize = true; if (unwinder == nullptr) { - unwinder = new unwindstack::UnwinderFromPid(koom::Constant::kMaxCallStackDepth, - getpid(), unwindstack::Regs::CurrentArch()); + unwinder = new unwindstack::UnwinderFromPid( + koom::Constant::kMaxCallStackDepth, getpid(), + unwindstack::Regs::CurrentArch()); unwinder->Init(); unwinder->SetDisplayBuildID(true); unwinder->SetRegs(unwindstack::Regs::CreateFromLocal()); @@ -137,11 +141,7 @@ std::string CallStack::SymbolizePc(uintptr_t pc, int index) { return format; } -void CallStack::DisableJava() { - disableJava = true; -} +void CallStack::DisableJava() { disableJava = true; } -void CallStack::DisableNative() { - disableNative = true; -} -} +void CallStack::DisableNative() { disableNative = true; } +} // namespace koom diff --git a/koom-thread-leak/src/main/cpp/src/common/looper.cpp b/koom-thread-leak/src/main/cpp/src/common/looper.cpp index b083080f..b8851da8 100644 --- a/koom-thread-leak/src/main/cpp/src/common/looper.cpp +++ b/koom-thread-leak/src/main/cpp/src/common/looper.cpp @@ -17,22 +17,23 @@ * */ -#include "looper.h" -#include "log.h" -#include +#include +#include +#include +#include #include #include -#include -#include -#include -#include +#include +#include #include -#include +#include +#include + +#include #include #include -#include -#include -#include +#include +#include #define TAG "koom-looper" #define LOGV(...) koom::Log::info(TAG, __VA_ARGS__); @@ -44,8 +45,8 @@ struct LooperMessage { bool quit; }; void *looper::trampoline(void *p) { - prctl(PR_SET_NAME,"koom-looper"); - ((looper *) p)->loop(); + prctl(PR_SET_NAME, "koom-looper"); + reinterpret_cast(p)->loop(); return nullptr; } looper::looper() { @@ -58,7 +59,9 @@ looper::looper() { } looper::~looper() { if (running) { - LOGV("Looper deleted while still running. Some messages will not be processed"); + LOGV( + "Looper deleted while still running. Some messages will not be " + "processed"); quit(); } } @@ -68,12 +71,12 @@ void looper::post(int what, void *data, bool flush) { msg->obj = data; msg->next = nullptr; msg->quit = false; -// LOGV("post msg %d build msg finish", msg->what); + // LOGV("post msg %d build msg finish", msg->what); addMsg(msg, flush); } void looper::addMsg(LooperMessage *msg, bool flush) { sem_wait(&headWriteProtect); -// LOGV("post msg %d start", msg->what); + // LOGV("post msg %d start", msg->what); LooperMessage *h = head; if (flush) { while (h) { @@ -90,7 +93,7 @@ void looper::addMsg(LooperMessage *msg, bool flush) { head = msg; tail = msg; } -// LOGV("post msg %d end", msg->what); + // LOGV("post msg %d end", msg->what); sem_post(&headWriteProtect); sem_post(&headDataAvailable); } diff --git a/koom-thread-leak/src/main/cpp/src/common/callstack.h b/koom-thread-leak/src/main/cpp/src/include/common/callstack.h similarity index 80% rename from koom-thread-leak/src/main/cpp/src/common/callstack.h rename to koom-thread-leak/src/main/cpp/src/include/common/callstack.h index 07b3b672..690e8e94 100644 --- a/koom-thread-leak/src/main/cpp/src/common/callstack.h +++ b/koom-thread-leak/src/main/cpp/src/include/common/callstack.h @@ -17,27 +17,27 @@ * */ -#ifndef APM_CALLSTACK_H -#define APM_CALLSTACK_H +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_CALLSTACK_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_CALLSTACK_H_ -#include -#include -#include "util.h" -#include "constant.h" -#include +#include +#include #include +#include #include +#include +#include +#include + namespace koom { -using dump_java_stack_above_o_ptr = void (*)(void *, std::ostream &os, bool, bool); +using dump_java_stack_above_o_ptr = void (*)(void *, std::ostream &os, bool, + bool); using dump_java_stack_ptr = void (*)(void *, std::ostream &os); class CallStack { - - enum Type { - java, native - }; + enum Type { java, native }; private: static dump_java_stack_above_o_ptr dump_java_stack_above_o; @@ -67,6 +67,6 @@ class CallStack { static void *GetCurrentThread(); }; -} +} // namespace koom -#endif //APM_CALLSTACK_H +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_CALLSTACK_H_ diff --git a/koom-thread-leak/src/main/cpp/src/common/constant.h b/koom-thread-leak/src/main/cpp/src/include/common/constant.h similarity index 70% rename from koom-thread-leak/src/main/cpp/src/common/constant.h rename to koom-thread-leak/src/main/cpp/src/include/common/constant.h index 63c70389..1a2327db 100644 --- a/koom-thread-leak/src/main/cpp/src/common/constant.h +++ b/koom-thread-leak/src/main/cpp/src/include/common/constant.h @@ -17,8 +17,8 @@ * */ -#ifndef APM_RESDETECTOR_CONSTANT_H -#define APM_RESDETECTOR_CONSTANT_H +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_CONSTANT_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_CONSTANT_H_ #include #include @@ -28,8 +28,8 @@ namespace koom { namespace Constant { #define ALWAYS_INLINE __attribute__((always_inline)) -const static int kMaxCallStackDepth = 18; -const static int kDlopenSourceInit = 0; -} -} -#endif //APM_RESDETECTOR_CONSTANT_H +static const int kMaxCallStackDepth = 18; +static const int kDlopenSourceInit = 0; +} // namespace Constant +} // namespace koom +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_CONSTANT_H_ diff --git a/koom-thread-leak/src/main/cpp/src/common/log.h b/koom-thread-leak/src/main/cpp/src/include/common/log.h similarity index 88% rename from koom-thread-leak/src/main/cpp/src/common/log.h rename to koom-thread-leak/src/main/cpp/src/include/common/log.h index 3a399362..0d4c0062 100644 --- a/koom-thread-leak/src/main/cpp/src/common/log.h +++ b/koom-thread-leak/src/main/cpp/src/include/common/log.h @@ -17,8 +17,8 @@ * */ -#ifndef APM_LOG_H -#define APM_LOG_H +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_LOG_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_LOG_H_ #include #include @@ -62,6 +62,6 @@ class Log { static const int kMaxLogLine = 512; }; -} +} // namespace koom -#endif //APM_LOG_H +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_LOG_H_ diff --git a/koom-thread-leak/src/main/cpp/src/common/looper.h b/koom-thread-leak/src/main/cpp/src/include/common/looper.h similarity index 84% rename from koom-thread-leak/src/main/cpp/src/common/looper.h rename to koom-thread-leak/src/main/cpp/src/include/common/looper.h index c7110fba..eebf55c7 100644 --- a/koom-thread-leak/src/main/cpp/src/common/looper.h +++ b/koom-thread-leak/src/main/cpp/src/include/common/looper.h @@ -16,6 +16,8 @@ * Created by shenvsv on 2021. * */ +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_LOOPER_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_LOOPER_H_ #include #include @@ -37,4 +39,6 @@ class looper { sem_t headWriteProtect; sem_t headDataAvailable; bool running; -}; \ No newline at end of file +}; + +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_LOOPER_H_ diff --git a/koom-thread-leak/src/main/cpp/src/common/util.h b/koom-thread-leak/src/main/cpp/src/include/common/util.h similarity index 73% rename from koom-thread-leak/src/main/cpp/src/common/util.h rename to koom-thread-leak/src/main/cpp/src/include/common/util.h index 59d6d156..2481e8a3 100644 --- a/koom-thread-leak/src/main/cpp/src/common/util.h +++ b/koom-thread-leak/src/main/cpp/src/include/common/util.h @@ -17,42 +17,38 @@ * */ -#ifndef APM_UTIL_H -#define APM_UTIL_H +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_UTIL_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_UTIL_H_ -#include -#include -#include "log.h" -#include -#include -#include -#include +#include #include #include +#include +#include +#include +#include +#include +#include + namespace koom { class Util { - public: static int android_api; - static void Init() { - android_api = android_get_device_api_level(); - } + static void Init() { android_api = android_get_device_api_level(); } - static int AndroidApi() { - return android_api; - } + static int AndroidApi() { return android_api; } static timespec CurrentClockTime() { - struct timespec now_time{}; + struct timespec now_time {}; clock_gettime(CLOCK_MONOTONIC, &now_time); return now_time; } - static long long CurrentTimeNs() { - struct timespec now_time{}; + static int64_t CurrentTimeNs() { + struct timespec now_time {}; clock_gettime(CLOCK_MONOTONIC, &now_time); return now_time.tv_sec * 1000000000LL + now_time.tv_nsec; } @@ -67,10 +63,10 @@ class Util { prev_pos = ++pos; } - output.push_back(s.substr(prev_pos, pos - prev_pos)); // Last word + output.push_back(s.substr(prev_pos, pos - prev_pos)); // Last word return output; } }; -} -#endif //APM_UTIL_H +} // namespace koom +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_COMMON_UTIL_H_ diff --git a/koom-thread-leak/src/main/cpp/src/koom.h b/koom-thread-leak/src/main/cpp/src/include/koom.h similarity index 83% rename from koom-thread-leak/src/main/cpp/src/koom.h rename to koom-thread-leak/src/main/cpp/src/include/koom.h index 78bb89ec..3da51d9c 100644 --- a/koom-thread-leak/src/main/cpp/src/koom.h +++ b/koom-thread-leak/src/main/cpp/src/include/koom.h @@ -17,11 +17,11 @@ * */ -#ifndef APM_KOOM_H -#define APM_KOOM_H +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_KOOM_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_KOOM_H_ #include -#include "thread/hook_looper.h" +#include "include/thread/hook_looper.h" namespace koom { @@ -52,6 +52,6 @@ extern void Refresh(); JNIEnv *GetEnv(bool doAttach = true); void JavaCallback(const char *value, bool doAttach = true); -} +} // namespace koom -#endif //APM_KOOM_H +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_KOOM_H_ diff --git a/koom-thread-leak/src/main/cpp/src/thread/hook_looper.h b/koom-thread-leak/src/main/cpp/src/include/thread/hook_looper.h similarity index 74% rename from koom-thread-leak/src/main/cpp/src/thread/hook_looper.h rename to koom-thread-leak/src/main/cpp/src/include/thread/hook_looper.h index 76a4caa7..28a6e6c9 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/hook_looper.h +++ b/koom-thread-leak/src/main/cpp/src/include/thread/hook_looper.h @@ -17,13 +17,14 @@ * */ -#ifndef APM_KOOM_THREAD_SRC_MAIN_CPP_SRC_THREAD_HOOK_LOOPER_H_ -#define APM_KOOM_THREAD_SRC_MAIN_CPP_SRC_THREAD_HOOK_LOOPER_H_ +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_HOOK_LOOPER_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_HOOK_LOOPER_H_ +#include #include +#include + #include -#include "common/looper.h" -#include "thread_holder.h" namespace koom { class HookLooper : public looper { public: @@ -33,5 +34,5 @@ class HookLooper : public looper { void handle(int what, void *data); void post(int what, void *data); }; -} -#endif //APM_KOOM_THREAD_SRC_MAIN_CPP_SRC_THREAD_HOOK_LOOPER_H_ \ No newline at end of file +} // namespace koom +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_HOOK_LOOPER_H_ diff --git a/koom-thread-leak/src/main/cpp/src/thread/loop_item.h b/koom-thread-leak/src/main/cpp/src/include/thread/loop_item.h similarity index 71% rename from koom-thread-leak/src/main/cpp/src/thread/loop_item.h rename to koom-thread-leak/src/main/cpp/src/include/thread/loop_item.h index 5863f41c..19a15528 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/loop_item.h +++ b/koom-thread-leak/src/main/cpp/src/include/thread/loop_item.h @@ -17,8 +17,10 @@ * */ -#ifndef KOOM_KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_THREAD_LOOP_ITEM_H_ -#define KOOM_KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_THREAD_LOOP_ITEM_H_ +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_LOOP_ITEM_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_LOOP_ITEM_H_ + +#include namespace koom { enum HookAction { ACTION_ADD_THREAD, @@ -38,31 +40,27 @@ class ThreadCreateArg { std::ostringstream java_stack; uintptr_t pc[koom::Constant::kMaxCallStackDepth]{}; ThreadCreateArg() {} - ~ThreadCreateArg() { - memset(pc, 0, sizeof(pc)); - } + ~ThreadCreateArg() { memset(pc, 0, sizeof(pc)); } }; struct SimpleHookInfo { - long long time; - SimpleHookInfo(long long time) { - this->time = time; - } + int64_t time; + explicit SimpleHookInfo(int64_t time) { this->time = time; } }; struct HookInfo { pthread_t thread_id; - long long time; - HookInfo(pthread_t threadId, long long time) { + int64_t time; + HookInfo(pthread_t threadId, int64_t time) { this->thread_id = threadId; this->time = time; } }; struct HookExitInfo { pthread_t thread_id; - long long time; + int64_t time; int tid; std::string threadName; - HookExitInfo(pthread_t threadId, int tid, char *threadName, long long time) { + HookExitInfo(pthread_t threadId, int tid, char *threadName, int64_t time) { this->thread_id = threadId; this->tid = tid; this->threadName.assign(threadName); @@ -78,18 +76,14 @@ struct HookAddInfo { bool is_thread_detached; ThreadCreateArg *create_arg; - HookAddInfo(int tid, - long long time, - pthread_t pthread, - bool isThreadDetached, - ThreadCreateArg *thread_create_arg - ) { + HookAddInfo(int tid, int64_t time, pthread_t pthread, bool isThreadDetached, + ThreadCreateArg *thread_create_arg) { this->tid = tid; this->time = time; this->pthread = pthread; this->is_thread_detached = isThreadDetached; this->create_arg = thread_create_arg; - }; + } }; -} -#endif //KOOM_KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_THREAD_LOOP_ITEM_H_ +} // namespace koom +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_LOOP_ITEM_H_ diff --git a/koom-thread-leak/src/main/cpp/src/thread/thread_holder.h b/koom-thread-leak/src/main/cpp/src/include/thread/thread_holder.h similarity index 61% rename from koom-thread-leak/src/main/cpp/src/thread/thread_holder.h rename to koom-thread-leak/src/main/cpp/src/include/thread/thread_holder.h index 70d824f4..de2137ad 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/thread_holder.h +++ b/koom-thread-leak/src/main/cpp/src/include/thread/thread_holder.h @@ -17,36 +17,39 @@ * */ -#ifndef APM_RESOURCEDATA_H -#define APM_RESOURCEDATA_H +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_HOLDER_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_HOLDER_H_ + +#include +#include +#include +#include +#include +#include -#include "common/log.h" -#include "common/util.h" -#include "common/callstack.h" -#include "thread_item.h" #include -#include "rapidjson/writer.h" -#include "loop_item.h" +#include namespace koom { class ThreadHolder { public: - void AddThread(int tid, pthread_t pthread, bool isThreadDetached, int64_t start_time, - ThreadCreateArg* create_arg); + void AddThread(int tid, pthread_t pthread, bool isThreadDetached, + int64_t start_time, ThreadCreateArg* create_arg); void JoinThread(pthread_t threadId); - void ExitThread(pthread_t threadId, std::string& threadName, long long int i); + void ExitThread(pthread_t threadId, std::string& threadName, int64_t time); void DetachThread(pthread_t threadId); - void ReportThreadLeak(long long time); + void ReportThreadLeak(int64_t time); private: std::map leakThreadMap; std::map threadMap; - void WriteThreadJson(rapidjson::Writer &writer, ThreadItem &thread_item); + void WriteThreadJson(rapidjson::Writer& writer, + ThreadItem& thread_item); void Clear() { leakThreadMap.clear(); threadMap.clear(); } }; -} -#endif //APM_RESOURCEDATA_H +} // namespace koom +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_HOLDER_H_ diff --git a/koom-thread-leak/src/main/cpp/src/thread/thread_hook.h b/koom-thread-leak/src/main/cpp/src/include/thread/thread_hook.h similarity index 77% rename from koom-thread-leak/src/main/cpp/src/thread/thread_hook.h rename to koom-thread-leak/src/main/cpp/src/include/thread/thread_hook.h index 354deace..966c912a 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/thread_hook.h +++ b/koom-thread-leak/src/main/cpp/src/include/thread/thread_hook.h @@ -17,16 +17,18 @@ * */ -#ifndef APM_THREAD_HOOK_H -#define APM_THREAD_HOOK_H +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_HOOK_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_HOOK_H_ -#include -#include "common/callstack.h" -#include -#include #include -#include "hook_looper.h" -#include "koom.h" +#include +#include +#include +#include +#include + +#include +#include namespace koom { @@ -44,7 +46,8 @@ class ThreadHooker { static void HookThreadExit(void *return_value); static bool RegisterSo(const std::string &lib, int source); static void InitHook(); - static void DlopenCallback(std::set &libs, int source, std::string &sourcelib); + static void DlopenCallback(std::set &libs, int source, + std::string &sourcelib); static void HookLibs(std::set &libs, int source); static bool hookEnabled(); }; @@ -55,15 +58,13 @@ class StartRtnArg { void *(*start_rtn)(void *); ThreadCreateArg *thread_create_arg; - StartRtnArg(void *arg, - long long time, - void *(*start_rtn)(void *)) { + StartRtnArg(void *arg, int64_t time, void *(*start_rtn)(void *)) { this->arg = arg; this->start_rtn = start_rtn; thread_create_arg = new ThreadCreateArg(); thread_create_arg->time = time; } }; -} +} // namespace koom -#endif //APM_THREAD_HOOK_H +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_HOOK_H_ diff --git a/koom-thread-leak/src/main/cpp/src/thread/thread_item.h b/koom-thread-leak/src/main/cpp/src/include/thread/thread_item.h similarity index 78% rename from koom-thread-leak/src/main/cpp/src/thread/thread_item.h rename to koom-thread-leak/src/main/cpp/src/include/thread/thread_item.h index d2a747ea..4016078c 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/thread_item.h +++ b/koom-thread-leak/src/main/cpp/src/include/thread/thread_item.h @@ -17,8 +17,8 @@ * */ -#ifndef APM_THREAD_H -#define APM_THREAD_H +#ifndef KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_ITEM_H_ +#define KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_ITEM_H_ #include namespace koom { @@ -29,8 +29,8 @@ class ThreadItem { std::string create_call_stack; std::string collect_mode{}; bool thread_detached{}; - long long startTime{}; - long long exitTime{}; + int64_t startTime{}; + int64_t exitTime{}; bool thread_reported{}; pthread_t thread_internal_id{}; std::string name{}; @@ -39,6 +39,5 @@ class ThreadItem { ThreadItem(const ThreadItem &threadItem); void Clear(); }; - -#endif //APM_THREAD_H -} \ No newline at end of file +} // namespace koom +#endif // KOOM_THREAD_LEAK_SRC_MAIN_CPP_SRC_INCLUDE_THREAD_THREAD_ITEM_H_ diff --git a/koom-thread-leak/src/main/cpp/src/jni_bridge.cpp b/koom-thread-leak/src/main/cpp/src/jni_bridge.cpp index 9d1c48ee..06d8c4b9 100644 --- a/koom-thread-leak/src/main/cpp/src/jni_bridge.cpp +++ b/koom-thread-leak/src/main/cpp/src/jni_bridge.cpp @@ -17,63 +17,62 @@ * */ +#include #include -#include "koom.h" -#include "common/callstack.h" +#include extern "C" { JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { koom::Log::info("koom-thread", "JNI_OnLoad"); JNIEnv *env = nullptr; - if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) { + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } koom::Init(vm, env); return JNI_VERSION_1_6; } -JNIEXPORT void JNICALL Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_disableJavaStack( +JNIEXPORT void JNICALL +Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_disableJavaStack( JNIEnv *env, jclass jObject) { koom::CallStack::DisableJava(); } -JNIEXPORT void JNICALL Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_disableNativeStack( +JNIEXPORT void JNICALL +Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_disableNativeStack( JNIEnv *env, jclass jObject) { koom::CallStack::DisableNative(); } -JNIEXPORT void JNICALL Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_start( - JNIEnv *env, - jclass obj) { +JNIEXPORT void JNICALL +Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_start( + JNIEnv *env, jclass obj) { koom::Log::info("koom-thread", "start"); koom::Start(); } -JNIEXPORT void JNICALL Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_refresh( - JNIEnv *env, - jclass obj) { +JNIEXPORT void JNICALL +Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_refresh( + JNIEnv *env, jclass obj) { koom::Refresh(); } -JNIEXPORT void JNICALL Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_stop( - JNIEnv *env, - jclass obj) { +JNIEXPORT void JNICALL +Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_stop( + JNIEnv *env, jclass obj) { koom::Stop(); } -JNIEXPORT void JNICALL Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_setThreadLeakDelay( - JNIEnv *env, - jclass thiz, - jlong delay) { +JNIEXPORT void JNICALL +Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_setThreadLeakDelay( + JNIEnv *env, jclass thiz, jlong delay) { koom::threadLeakDelay = delay; } -JNIEXPORT void JNICALL Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_enableNativeLog( - JNIEnv *env, - jclass jObject) { +JNIEXPORT void JNICALL +Java_com_kwai_performance_overhead_thread_monitor_NativeHandler_enableNativeLog( + JNIEnv *env, jclass jObject) { koom::Log::log_enable = true; } } - - diff --git a/koom-thread-leak/src/main/cpp/src/koom.cpp b/koom-thread-leak/src/main/cpp/src/koom.cpp index b42ada7e..7cdff4bb 100644 --- a/koom-thread-leak/src/main/cpp/src/koom.cpp +++ b/koom-thread-leak/src/main/cpp/src/koom.cpp @@ -17,12 +17,12 @@ * */ +#include +#include #include -#include "koom.h" -#include "common/util.h" -#include "common/callstack.h" -#include "thread/thread_hook.h" -#include "thread/hook_looper.h" +#include +#include +#include namespace koom { @@ -34,15 +34,15 @@ jclass native_handler_class; jmethodID java_callback_method; std::atomic isRunning; HookLooper *sHookLooper; -long threadLeakDelay; +int64_t threadLeakDelay; void Init(JavaVM *vm, _JNIEnv *env) { java_vm_ = vm; - auto clazz = env->FindClass("com/kwai/performance/overhead/thread/monitor/NativeHandler"); + auto clazz = env->FindClass( + "com/kwai/performance/overhead/thread/monitor/NativeHandler"); native_handler_class = static_cast(env->NewGlobalRef(clazz)); - java_callback_method = env->GetStaticMethodID(native_handler_class, - "nativeReport", - "(Ljava/lang/String;)V"); + java_callback_method = env->GetStaticMethodID( + native_handler_class, "nativeReport", "(Ljava/lang/String;)V"); Util::Init(); Log::info("koom", "Init, android api:%d", Util::AndroidApi()); CallStack::Init(); @@ -72,7 +72,8 @@ void Refresh() { JNIEnv *GetEnv(bool doAttach) { JNIEnv *env = nullptr; - int status = java_vm_->GetEnv((void **) &env, JNI_VERSION_1_6); + int status = + java_vm_->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6); if ((status == JNI_EDETACHED || env == nullptr) && doAttach) { status = java_vm_->AttachCurrentThread(&env, nullptr); if (status < 0) { @@ -87,11 +88,12 @@ void JavaCallback(const char *value, bool doAttach) { if (env != nullptr && value != nullptr) { Log::error("koom", "JavaCallback %d", strlen(value)); jstring string_value = env->NewStringUTF(value); - env->CallStaticVoidMethod(native_handler_class, java_callback_method, string_value); + env->CallStaticVoidMethod(native_handler_class, java_callback_method, + string_value); Log::info("koom", "JavaCallback finished"); } else { Log::info("koom", "JavaCallback fail no JNIEnv"); } } -} \ No newline at end of file +} // namespace koom diff --git a/koom-thread-leak/src/main/cpp/src/thread/hook_looper.cpp b/koom-thread-leak/src/main/cpp/src/thread/hook_looper.cpp index 3d0a3e4b..9a6cf870 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/hook_looper.cpp +++ b/koom-thread-leak/src/main/cpp/src/thread/hook_looper.cpp @@ -17,25 +17,21 @@ * */ -#include "hook_looper.h" -#include "koom.h" -#include "loop_item.h" +#include +#include +#include namespace koom { const char *looper_tag = "koom-hook-looper"; -HookLooper::HookLooper() : looper() { - this->holder = new koom::ThreadHolder(); -} -HookLooper::~HookLooper() { - delete this->holder; -} +HookLooper::HookLooper() : looper() { this->holder = new koom::ThreadHolder(); } +HookLooper::~HookLooper() { delete this->holder; } void HookLooper::handle(int what, void *data) { looper::handle(what, data); switch (what) { case ACTION_ADD_THREAD: { koom::Log::info(looper_tag, "AddThread"); auto info = static_cast(data); - holder->AddThread(info->tid, info->pthread, info->is_thread_detached, info->time, - info->create_arg); + holder->AddThread(info->tid, info->pthread, info->is_thread_detached, + info->time, info->create_arg); delete info; break; } @@ -68,11 +64,8 @@ void HookLooper::handle(int what, void *data) { break; } default: { - } } } -void HookLooper::post(int what, void *data) { - looper::post(what, data); -} -} \ No newline at end of file +void HookLooper::post(int what, void *data) { looper::post(what, data); } +} // namespace koom diff --git a/koom-thread-leak/src/main/cpp/src/thread/thread_holder.cpp b/koom-thread-leak/src/main/cpp/src/thread/thread_holder.cpp index f305c19d..725816c2 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/thread_holder.cpp +++ b/koom-thread-leak/src/main/cpp/src/thread/thread_holder.cpp @@ -1,6 +1,6 @@ -#include "thread_holder.h" -#include "thread_hook.h" -#include "koom.h" +#include +#include +#include #include #include @@ -70,7 +70,7 @@ void ThreadHolder::JoinThread(pthread_t threadId) { } } -void ThreadHolder::ExitThread(pthread_t threadId, std::string &threadName, long long int time) { +void ThreadHolder::ExitThread(pthread_t threadId, std::string &threadName, int64_t time) { bool valid = threadMap.count(threadId) > 0; if (!valid) return; auto &item = threadMap[threadId]; @@ -134,7 +134,7 @@ void ThreadHolder::WriteThreadJson(rapidjson::Writer &w writer.EndObject(); } -void ThreadHolder::ReportThreadLeak(long long time) { +void ThreadHolder::ReportThreadLeak(int64_t time) { int needReport{}; const char *type = "detach_leak"; auto delay = threadLeakDelay * 1000000LL; // ms -> ns diff --git a/koom-thread-leak/src/main/cpp/src/thread/thread_hook.cpp b/koom-thread-leak/src/main/cpp/src/thread/thread_hook.cpp index bd839012..71d4753f 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/thread_hook.cpp +++ b/koom-thread-leak/src/main/cpp/src/thread/thread_hook.cpp @@ -17,20 +17,20 @@ * */ -#include "thread_hook.h" +#include + #include +#include #include #include -#include #include -#include +#include namespace koom { const char *thread_tag = "thread-hook"; -const char *ignore_libs[] = {"koom-thread", - "liblog.so", "perfd", "memtrack"}; +const char *ignore_libs[] = {"koom-thread", "liblog.so", "perfd", "memtrack"}; static bool IsLibIgnored(const std::string &lib) { for (const auto &ignoreLib : ignore_libs) { @@ -55,8 +55,8 @@ void ThreadHooker::InitHook() { DlopenCb::GetInstance().AddCallback(DlopenCallback); } -void ThreadHooker::DlopenCallback(std::set &libs, int source, std::string -&source_lib) { +void ThreadHooker::DlopenCallback(std::set &libs, int source, + std::string &source_lib) { HookLibs(libs, source); } @@ -84,33 +84,34 @@ bool ThreadHooker::RegisterSo(const std::string &lib, int source) { } auto lib_ctr = lib.c_str(); koom::Log::info(thread_tag, "HookSo %d %s", source, lib_ctr); - xhook_register(lib_ctr, "pthread_create", reinterpret_cast(HookThreadCreate), nullptr); - xhook_register(lib_ctr, "pthread_detach", reinterpret_cast(HookThreadDetach), nullptr); - xhook_register(lib_ctr, "pthread_join", reinterpret_cast(HookThreadJoin), nullptr); - xhook_register(lib_ctr, "pthread_exit", reinterpret_cast(HookThreadExit), nullptr); + xhook_register(lib_ctr, "pthread_create", + reinterpret_cast(HookThreadCreate), nullptr); + xhook_register(lib_ctr, "pthread_detach", + reinterpret_cast(HookThreadDetach), nullptr); + xhook_register(lib_ctr, "pthread_join", + reinterpret_cast(HookThreadJoin), nullptr); + xhook_register(lib_ctr, "pthread_exit", + reinterpret_cast(HookThreadExit), nullptr); return true; } -int ThreadHooker::HookThreadCreate(pthread_t *tidp, - const pthread_attr_t *attr, - void *(*start_rtn)( - void *), - void *arg) { +int ThreadHooker::HookThreadCreate(pthread_t *tidp, const pthread_attr_t *attr, + void *(*start_rtn)(void *), void *arg) { if (hookEnabled() && start_rtn != nullptr) { auto time = Util::CurrentTimeNs(); - koom::Log::info(thread_tag, - "HookThreadCreate"); + koom::Log::info(thread_tag, "HookThreadCreate"); auto *hook_arg = new StartRtnArg(arg, Util::CurrentTimeNs(), start_rtn); auto *thread_create_arg = hook_arg->thread_create_arg; void *thread = koom::CallStack::GetCurrentThread(); if (thread != nullptr) { - koom::CallStack::JavaStackTrace(thread, hook_arg->thread_create_arg->java_stack); + koom::CallStack::JavaStackTrace(thread, + hook_arg->thread_create_arg->java_stack); } - koom::CallStack::FastUnwind(thread_create_arg->pc, koom::Constant::kMaxCallStackDepth); + koom::CallStack::FastUnwind(thread_create_arg->pc, + koom::Constant::kMaxCallStackDepth); thread_create_arg->stack_time = Util::CurrentTimeNs() - time; - return pthread_create(tidp, - attr, + return pthread_create(tidp, attr, reinterpret_cast(HookThreadStart), reinterpret_cast(hook_arg)); } @@ -119,19 +120,20 @@ int ThreadHooker::HookThreadCreate(pthread_t *tidp, ALWAYS_INLINE void ThreadHooker::HookThreadStart(void *arg) { koom::Log::info(thread_tag, "HookThreadStart"); - auto *hookArg = (StartRtnArg *) arg; + auto *hookArg = reinterpret_cast(arg); pthread_attr_t attr; pthread_t self = pthread_self(); int state = 0; if (pthread_getattr_np(self, &attr) == 0) { pthread_attr_getdetachstate(&attr, &state); } - int tid = (int) syscall(SYS_gettid); + int tid = static_cast(syscall(SYS_gettid)); koom::Log::info(thread_tag, "HookThreadStart %p, %d, %d", self, tid, hookArg->thread_create_arg->stack_time); auto info = new HookAddInfo(tid, Util::CurrentTimeNs(), self, - state == PTHREAD_CREATE_DETACHED, hookArg->thread_create_arg); + state == PTHREAD_CREATE_DETACHED, + hookArg->thread_create_arg); sHookLooper->post(ACTION_ADD_THREAD, info); void *(*start_rtn)(void *) = hookArg->start_rtn; @@ -143,22 +145,19 @@ ALWAYS_INLINE void ThreadHooker::HookThreadStart(void *arg) { int ThreadHooker::HookThreadDetach(pthread_t t) { if (!hookEnabled()) return pthread_detach(t); - int c_tid = (int) syscall(SYS_gettid); - koom::Log::info(thread_tag, "HookThreadDetach c_tid:%0x", - c_tid); + int c_tid = static_cast(syscall(SYS_gettid)); + koom::Log::info(thread_tag, "HookThreadDetach c_tid:%0x", c_tid); auto info = new HookInfo(t, Util::CurrentTimeNs()); sHookLooper->post(ACTION_DETACH_THREAD, info); return pthread_detach(t); } -int ThreadHooker::HookThreadJoin(pthread_t t, - void **return_value) { +int ThreadHooker::HookThreadJoin(pthread_t t, void **return_value) { if (!hookEnabled()) return pthread_join(t, return_value); - int c_tid = (int) syscall(SYS_gettid); - koom::Log::info(thread_tag, "HookThreadJoin c_tid:%0x", - c_tid); + int c_tid = static_cast(syscall(SYS_gettid)); + koom::Log::info(thread_tag, "HookThreadJoin c_tid:%0x", c_tid); auto info = new HookInfo(t, Util::CurrentTimeNs()); sHookLooper->post(ACTION_JOIN_THREAD, info); @@ -169,21 +168,18 @@ void ThreadHooker::HookThreadExit(void *return_value) { if (!hookEnabled()) pthread_exit(return_value); koom::Log::info(thread_tag, "HookThreadExit"); - int tid = (int) syscall(SYS_gettid); + int tid = static_cast(syscall(SYS_gettid)); char thread_name[16]{}; prctl(PR_GET_NAME, thread_name); - auto info = new HookExitInfo(pthread_self(), tid, thread_name, Util::CurrentTimeNs()); + auto info = + new HookExitInfo(pthread_self(), tid, thread_name, Util::CurrentTimeNs()); sHookLooper->post(ACTION_EXIT_THREAD, info); pthread_exit(return_value); } -void ThreadHooker::Start() { - ThreadHooker::InitHook(); -} +void ThreadHooker::Start() { ThreadHooker::InitHook(); } void ThreadHooker::Stop() {} -bool ThreadHooker::hookEnabled() { - return isRunning; -} -} \ No newline at end of file +bool ThreadHooker::hookEnabled() { return isRunning; } +} // namespace koom diff --git a/koom-thread-leak/src/main/cpp/src/thread/thread_item.cpp b/koom-thread-leak/src/main/cpp/src/thread/thread_item.cpp index 5e85fef0..64633053 100644 --- a/koom-thread-leak/src/main/cpp/src/thread/thread_item.cpp +++ b/koom-thread-leak/src/main/cpp/src/thread/thread_item.cpp @@ -17,7 +17,7 @@ * */ -#include "thread_item.h" +#include namespace koom { @@ -48,4 +48,4 @@ void ThreadItem::Clear() { this->name.clear(); this->collect_mode.clear(); } -} \ No newline at end of file +} // namespace koom