Skip to content

Commit befaa3e

Browse files
committed
Use log_error_for_exception in the Python API to pass tracebacks in the stack trace associated with log messages, instead of creating large mutli-line messages for every exception
1 parent 24fef31 commit befaa3e

26 files changed

+350
-334
lines changed

python/architecture.py

Lines changed: 61 additions & 62 deletions
Large diffs are not rendered by default.

python/binaryview.py

Lines changed: 77 additions & 77 deletions
Large diffs are not rendered by default.

python/callingconvention.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
# Binary Ninja components
2626
from . import _binaryninjacore as core
27-
from .log import log_error
27+
from .log import log_error_for_exception
2828
from . import variable
2929
from . import function
3030
from . import architecture
@@ -232,7 +232,7 @@ def _get_caller_saved_regs(self, ctxt, count):
232232
self._pending_reg_lists[result.value] = (result, reg_buf)
233233
return result.value
234234
except:
235-
log_error(traceback.format_exc())
235+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_caller_saved_regs")
236236
count[0] = 0
237237
return None
238238

@@ -247,7 +247,7 @@ def _get_callee_saved_regs(self, ctxt, count):
247247
self._pending_reg_lists[result.value] = (result, reg_buf)
248248
return result.value
249249
except:
250-
log_error(traceback.format_exc())
250+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_callee_saved_regs")
251251
count[0] = 0
252252
return None
253253

@@ -262,7 +262,7 @@ def _get_int_arg_regs(self, ctxt, count):
262262
self._pending_reg_lists[result.value] = (result, reg_buf)
263263
return result.value
264264
except:
265-
log_error(traceback.format_exc())
265+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_int_arg_regs")
266266
count[0] = 0
267267
return None
268268

@@ -277,7 +277,7 @@ def _get_float_arg_regs(self, ctxt, count):
277277
self._pending_reg_lists[result.value] = (result, reg_buf)
278278
return result.value
279279
except:
280-
log_error(traceback.format_exc())
280+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_float_arg_regs")
281281
count[0] = 0
282282
return None
283283

@@ -288,41 +288,41 @@ def _free_register_list(self, ctxt, regs, count):
288288
raise ValueError("freeing register list that wasn't allocated")
289289
del self._pending_reg_lists[buf.value]
290290
except:
291-
log_error(traceback.format_exc())
291+
log_error_for_exception("Unhandled Python exception in CallingConvention._free_register_list")
292292

293293
def _arg_regs_share_index(self, ctxt):
294294
try:
295295
return self.__class__.arg_regs_share_index
296296
except:
297-
log_error(traceback.format_exc())
297+
log_error_for_exception("Unhandled Python exception in CallingConvention._arg_regs_share_index")
298298
return False
299299

300300
def _arg_regs_used_for_varargs(self, ctxt):
301301
try:
302302
return self.__class__.arg_regs_for_varargs
303303
except:
304-
log_error(traceback.format_exc())
304+
log_error_for_exception("Unhandled Python exception in CallingConvention._arg_regs_for_varargs")
305305
return False
306306

307307
def _stack_reserved_for_arg_regs(self, ctxt):
308308
try:
309309
return self.__class__.stack_reserved_for_arg_regs
310310
except:
311-
log_error(traceback.format_exc())
311+
log_error_for_exception("Unhandled Python exception in CallingConvention._stack_reserved_for_arg_regs")
312312
return False
313313

314314
def _stack_adjusted_on_return(self, ctxt):
315315
try:
316316
return self.__class__.stack_adjusted_on_return
317317
except:
318-
log_error(traceback.format_exc())
318+
log_error_for_exception("Unhandled Python exception in CallingConvention._stack_adjusted_on_return")
319319
return False
320320

321321
def _eligible_for_heuristics(self, ctxt):
322322
try:
323323
return self.__class__.eligible_for_heuristics
324324
except:
325-
log_error(traceback.format_exc())
325+
log_error_for_exception("Unhandled Python exception in CallingConvention._eligible_for_heuristics")
326326
return False
327327

328328
def _get_int_return_reg(self, ctxt):
@@ -333,7 +333,7 @@ def _get_int_return_reg(self, ctxt):
333333
try:
334334
return self.arch.regs[self.__class__.int_return_reg].index
335335
except:
336-
log_error(traceback.format_exc())
336+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_int_return_reg")
337337
return False
338338

339339
def _get_high_int_return_reg(self, ctxt):
@@ -342,7 +342,7 @@ def _get_high_int_return_reg(self, ctxt):
342342
return 0xffffffff
343343
return self.arch.regs[self.__class__.high_int_return_reg].index
344344
except:
345-
log_error(traceback.format_exc())
345+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_high_int_return_reg")
346346
return False
347347

348348
def _get_float_return_reg(self, ctxt):
@@ -351,7 +351,7 @@ def _get_float_return_reg(self, ctxt):
351351
return 0xffffffff
352352
return self.arch.regs[self.__class__.float_return_reg].index
353353
except:
354-
log_error(traceback.format_exc())
354+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_float_return_reg")
355355
return False
356356

357357
def _get_global_pointer_reg(self, ctxt):
@@ -360,7 +360,7 @@ def _get_global_pointer_reg(self, ctxt):
360360
return 0xffffffff
361361
return self.arch.regs[self.__class__.global_pointer_reg].index
362362
except:
363-
log_error(traceback.format_exc())
363+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_global_pointer_reg")
364364
return False
365365

366366
def _get_implicitly_defined_regs(self, ctxt, count):
@@ -374,7 +374,7 @@ def _get_implicitly_defined_regs(self, ctxt, count):
374374
self._pending_reg_lists[result.value] = (result, reg_buf)
375375
return result.value
376376
except:
377-
log_error(traceback.format_exc())
377+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_implicitly_defined_regs")
378378
count[0] = 0
379379
return None
380380

@@ -384,7 +384,7 @@ def _get_incoming_reg_value(self, ctxt, reg, func, result):
384384
reg_name = self.arch.get_reg_name(reg)
385385
api_obj = self.perform_get_incoming_reg_value(reg_name, func_obj)._to_core_struct()
386386
except:
387-
log_error(traceback.format_exc())
387+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_incoming_reg_value")
388388
api_obj = variable.Undetermined()._to_core_struct()
389389
result[0].state = api_obj.state
390390
result[0].value = api_obj.value
@@ -395,7 +395,7 @@ def _get_incoming_flag_value(self, ctxt, reg, func, result):
395395
reg_name = self.arch.get_reg_name(reg)
396396
api_obj = self.perform_get_incoming_flag_value(reg_name, func_obj)._to_core_struct()
397397
except:
398-
log_error(traceback.format_exc())
398+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_incoming_flag_value")
399399
api_obj = variable.Undetermined()._to_core_struct()
400400
result[0].state = api_obj.state
401401
result[0].value = api_obj.value
@@ -412,7 +412,7 @@ def _get_incoming_var_for_parameter_var(self, ctxt, in_var, func, result):
412412
result[0].index = out_var.index
413413
result[0].storage = out_var.storage
414414
except:
415-
log_error(traceback.format_exc())
415+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_incoming_var_for_parameter_var")
416416
result[0].type = in_var[0].type
417417
result[0].index = in_var[0].index
418418
result[0].storage = in_var[0].storage
@@ -429,7 +429,7 @@ def _get_parameter_var_for_incoming_var(self, ctxt, in_var, func, result):
429429
result[0].index = out_var.index
430430
result[0].storage = out_var.storage
431431
except:
432-
log_error(traceback.format_exc())
432+
log_error_for_exception("Unhandled Python exception in CallingConvention._get_parameter_var_for_incoming_var")
433433
result[0].type = in_var[0].type
434434
result[0].index = in_var[0].index
435435
result[0].storage = in_var[0].storage

python/datarender.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from . import binaryview
2828
from . import function
2929
from . import enums
30-
from .log import log_error
30+
from .log import log_error_for_exception
3131
from . import types
3232
from . import highlight
3333
from . import types
@@ -113,7 +113,7 @@ def _free_object(self, ctxt):
113113
try:
114114
self.perform_free_object(ctxt)
115115
except:
116-
log_error(traceback.format_exc())
116+
log_error_for_exception("Unhandled Python exception while freeing DataRenderer")
117117

118118
def _is_valid_for_data(self, ctxt, view, addr, type, context, ctxCount):
119119
try:
@@ -127,7 +127,7 @@ def _is_valid_for_data(self, ctxt, view, addr, type, context, ctxCount):
127127
)
128128
return self.perform_is_valid_for_data(ctxt, view, addr, type, pycontext)
129129
except:
130-
log_error(traceback.format_exc())
130+
log_error_for_exception("Unhandled Python exception in DataRenderer._is_valid_for_data")
131131
return False
132132

133133
def _get_lines_for_data(self, ctxt, view, addr, type, prefix, prefixCount, width, count, typeCtx, ctxCount, language):
@@ -175,7 +175,7 @@ def _get_lines_for_data(self, ctxt, view, addr, type, prefix, prefixCount, width
175175

176176
return ctypes.cast(self.line_buf, ctypes.c_void_p).value
177177
except:
178-
log_error(traceback.format_exc())
178+
log_error_for_exception("Unhandled Python exception in DataRenderer._get_lines_for_data")
179179
return None
180180

181181
def _free_lines(self, ctxt, lines, count):

python/debuginfo.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from . import _binaryninjacore as core
2929
from . import platform as _platform
3030
from . import types as _types
31-
from .log import log_error
31+
from .log import log_error_for_exception
3232
from . import binaryview
3333
from . import filemetadata
3434
from . import typecontainer
@@ -102,7 +102,7 @@ def _is_valid(view: core.BNBinaryView, callback: Callable[['binaryview.BinaryVie
102102
view_obj = binaryview.BinaryView(file_metadata=file_metadata, handle=core.BNNewViewReference(view))
103103
return callback(view_obj)
104104
except:
105-
log_error(traceback.format_exc())
105+
log_error_for_exception("Unhandled Python exception in _DebugInfoParserMetaClass._is_valid")
106106
return False
107107

108108
@staticmethod
@@ -119,7 +119,7 @@ def _parse_info(
119119
assert parser_ref is not None, "core.BNNewDebugInfoReference returned None"
120120
return callback(DebugInfo(parser_ref), view_obj, debug_view_obj, progress)
121121
except:
122-
log_error(traceback.format_exc())
122+
log_error_for_exception("Unhandled Python exception in _DebugInfoParserMetaClass._parse_info")
123123
return False
124124

125125
@classmethod

python/demangle.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from . import _binaryninjacore as core
2727
from . import binaryview
2828
from . import types
29-
from .log import log_error
29+
from .log import log_error_for_exception
3030
from .architecture import Architecture, CoreArchitecture
3131
from .platform import Platform
3232
from typing import Iterable, List, Optional, Union, Tuple
@@ -369,7 +369,7 @@ def _is_mangled_string(self, ctxt, name):
369369
try:
370370
return self.is_mangled_string(core.pyNativeStr(name))
371371
except:
372-
log_error(traceback.format_exc())
372+
log_error_for_exception("Unhandled Python exception in Demangler._is_mangled_string")
373373
return False
374374

375375
def _demangle(self, ctxt, arch, name, out_type, out_var_name, view):
@@ -395,14 +395,14 @@ def _demangle(self, ctxt, arch, name, out_type, out_var_name, view):
395395
out_var_name[0] = Demangler._cached_name
396396
return True
397397
except:
398-
log_error(traceback.format_exc())
398+
log_error_for_exception("Unhandled Python exception in Demangler._demangle")
399399
return False
400400

401401
def _free_var_name(self, ctxt, name):
402402
try:
403403
Demangler._cached_name = None
404404
except:
405-
log_error(traceback.format_exc())
405+
log_error_for_exception("Unhandled Python exception in Demangler._free_var_name")
406406

407407
def is_mangled_string(self, name: str) -> bool:
408408
"""

python/downloadprovider.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import binaryninja
3030
import binaryninja._binaryninjacore as core
3131
from . import settings
32-
from .log import log_error
32+
from .log import log_error_for_exception
3333

3434

3535
def to_bytes(field):
@@ -75,13 +75,13 @@ def _destroy_instance(self, ctxt):
7575
self.__class__._registered_instances.remove(self)
7676
self.perform_destroy_instance()
7777
except:
78-
log_error(traceback.format_exc())
78+
log_error_for_exception("Unhandled Python exception in DownloadInstance._destroy_instance")
7979

8080
def _perform_request(self, ctxt, url):
8181
try:
8282
return self.perform_request(url)
8383
except:
84-
log_error(traceback.format_exc())
84+
log_error_for_exception("Unhandled Python exception in DownloadInstance._perform_request")
8585
return -1
8686

8787
def _perform_custom_request(self, ctxt, method, url, header_count, header_keys, header_values, response):
@@ -117,7 +117,7 @@ def data_generator():
117117
except Exception as e:
118118
out_response[0] = None
119119
core.BNSetErrorForDownloadInstance(self.handle, e.__class__.__name__)
120-
log_error(traceback.format_exc())
120+
log_error_for_exception("Unhandled Python exception in DownloadInstance._perform_custom_request")
121121
return -1
122122

123123
if py_response is not None:
@@ -137,7 +137,7 @@ def data_generator():
137137
return 0 if py_response is not None else -1
138138
except:
139139
out_response[0] = None
140-
log_error(traceback.format_exc())
140+
log_error_for_exception("Unhandled Python exception in DownloadInstance._perform_custom_request")
141141
return -1
142142

143143
def _free_response(self, ctxt, response):
@@ -168,7 +168,7 @@ def _read_callback(self, data, len_, ctxt):
168168

169169
return bytes_len
170170
except:
171-
log_error(traceback.format_exc())
171+
log_error_for_exception("Unhandled Python exception in DownloadInstance._read_callback")
172172
return 0
173173

174174
def _write_callback(self, data, len, ctxt):
@@ -177,7 +177,7 @@ def _write_callback(self, data, len, ctxt):
177177
self._response = self._response + str_bytes
178178
return len
179179
except:
180-
log_error(traceback.format_exc())
180+
log_error_for_exception("Unhandled Python exception in DownloadInstance._write_callback")
181181
return 0
182182

183183
def get_response(self, url):
@@ -297,7 +297,7 @@ def _create_instance(self, ctxt):
297297
assert download_instance is not None, "core.BNNewDownloadInstanceReference returned None"
298298
return ctypes.cast(download_instance, ctypes.c_void_p).value
299299
except:
300-
log_error(traceback.format_exc())
300+
log_error_for_exception("Unhandled Python exception in DownloadProvider._create_instance")
301301
return None
302302

303303
def create_instance(self):
@@ -387,7 +387,7 @@ def perform_request(self, url):
387387
return -1
388388
except:
389389
core.BNSetErrorForDownloadInstance(self.handle, "Unknown Exception!")
390-
log_error(traceback.format_exc())
390+
log_error_for_exception("Unhandled Python exception in PythonDownloadInstance.perform_request")
391391
return -1
392392

393393
return 0
@@ -486,11 +486,11 @@ def perform_request(self, url):
486486

487487
except URLError as e:
488488
core.BNSetErrorForDownloadInstance(self.handle, e.__class__.__name__)
489-
log_error(str(e))
489+
log_error_for_exception(str(e))
490490
return -1
491491
except:
492492
core.BNSetErrorForDownloadInstance(self.handle, "Unknown Exception!")
493-
log_error(traceback.format_exc())
493+
log_error_for_exception("Unhandled Python exception in PythonDownloadInstance.perform_request")
494494
return -1
495495

496496
return 0

0 commit comments

Comments
 (0)