summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-04-27 00:40:07 -0400
committerRusty Wagner <rusty@vector35.com>2017-04-27 00:40:17 -0400
commit448097c6eca321519f2de88619afa804ad6d4ef9 (patch)
tree427a61a553f57316898d8a9baf7b372dd0e246d9
parent5076356e33c52b45ccc9a0e794cae5cdd0234fdf (diff)
Adding an API for performance debugging
-rw-r--r--binaryninjaapi.h2
-rw-r--r--binaryninjacore.h9
-rw-r--r--function.cpp13
-rw-r--r--python/function.py10
4 files changed, 34 insertions, 0 deletions
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<std::string, double> 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<string, double> Function::GetAnalysisPerformanceInfo()
+{
+ size_t count;
+ BNPerformanceInfo* info = BNGetFunctionAnalysisPerformanceInfo(m_object, &count);
+
+ map<string, double> 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)