From 448097c6eca321519f2de88619afa804ad6d4ef9 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 27 Apr 2017 00:40:07 -0400 Subject: Adding an API for performance debugging --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 9 +++++++++ function.cpp | 13 +++++++++++++ python/function.py | 10 ++++++++++ 4 files changed, 34 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index ab84afc4..8812e7c9 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1997,6 +1997,8 @@ namespace BinaryNinja void RequestAdvancedAnalysisData(); void ReleaseAdvancedAnalysisData(); void ReleaseAdvancedAnalysisData(size_t count); + + std::map GetAnalysisPerformanceInfo(); }; class AdvancedFunctionAnalysisDataRequestor diff --git a/binaryninjacore.h b/binaryninjacore.h index 7e9a034f..dcd9941c 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -1456,6 +1456,12 @@ extern "C" BNILBranchDependence dependence; }; + struct BNPerformanceInfo + { + char* name; + double seconds; + }; + BINARYNINJACOREAPI char* BNAllocString(const char* contents); BINARYNINJACOREAPI void BNFreeString(char* str); BINARYNINJACOREAPI void BNFreeStringList(char** strs, size_t count); @@ -2101,6 +2107,9 @@ extern "C" BINARYNINJACOREAPI void BNSetAutoBasicBlockHighlight(BNBasicBlock* block, BNHighlightColor color); BINARYNINJACOREAPI void BNSetUserBasicBlockHighlight(BNBasicBlock* block, BNHighlightColor color); + BINARYNINJACOREAPI BNPerformanceInfo* BNGetFunctionAnalysisPerformanceInfo(BNFunction* func, size_t* count); + BINARYNINJACOREAPI void BNFreeAnalysisPerformanceInfo(BNPerformanceInfo* info, size_t count); + // Disassembly settings BINARYNINJACOREAPI BNDisassemblySettings* BNCreateDisassemblySettings(void); BINARYNINJACOREAPI BNDisassemblySettings* BNNewDisassemblySettingsReference(BNDisassemblySettings* settings); diff --git a/function.cpp b/function.cpp index d4f91db1..194153a8 100644 --- a/function.cpp +++ b/function.cpp @@ -861,6 +861,19 @@ void Function::ReleaseAdvancedAnalysisData() } +map Function::GetAnalysisPerformanceInfo() +{ + size_t count; + BNPerformanceInfo* info = BNGetFunctionAnalysisPerformanceInfo(m_object, &count); + + map result; + for (size_t i = 0; i < count; i++) + result[info[i].name] = info[i].seconds; + BNFreeAnalysisPerformanceInfo(info, count); + return result; +} + + AdvancedFunctionAnalysisDataRequestor::AdvancedFunctionAnalysisDataRequestor(Function* func): m_func(func) { if (m_func) diff --git a/python/function.py b/python/function.py index d54cf25a..2a0176c9 100644 --- a/python/function.py +++ b/python/function.py @@ -426,6 +426,16 @@ class Function(object): else: return Function._associated_data[handle.value] + @property + def analysis_performance_info(self): + count = ctypes.c_ulonglong() + info = core.BNGetFunctionAnalysisPerformanceInfo(self.handle, count) + result = {} + for i in xrange(0, count.value): + result[info[i].name] = info[i].seconds + core.BNFreeAnalysisPerformanceInfo(info, count.value) + return result + def __iter__(self): count = ctypes.c_ulonglong() blocks = core.BNGetFunctionBasicBlockList(self.handle, count) -- cgit v1.3.1