Skip to content

Commit 922eedd

Browse files
authoredJan 16, 2024
#87 add client symbol cache for gdb (#88)
1 parent 08f3b11 commit 922eedd

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed
 

‎decomp2dbg/clients/gdb/gdb_client.py

+16-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def __init__(self, gdb_client, name="decompiler", host="127.0.0.1", port=3662):
2323
self.symbol_mapper = SymbolMapper()
2424
self._is_pie = None
2525
self._lvar_bptr = None
26+
self._symbol_cache = set()
2627

2728
@property
2829
@lru_cache()
@@ -52,6 +53,13 @@ def decompiler_connected(self):
5253
def decompiler_disconnected(self):
5354
self.gdb_client.on_decompiler_disconnected(self.name)
5455

56+
def _cache(self, item):
57+
if item in self._symbol_cache:
58+
return False
59+
60+
self._symbol_cache.add(item)
61+
return True
62+
5563
def update_symbols(self):
5664
self.symbol_mapper.text_base_addr = self.text_base_addr
5765

@@ -66,7 +74,10 @@ def update_symbols(self):
6674

6775
# add symbols with native support if possible
6876
for addr, func in func_headers.items():
69-
syms_to_add.append((func["name"], int(addr, 0), "function", func["size"]))
77+
symbol = (func["name"], int(addr, 0), "function", func["size"])
78+
new_entry = self._cache(symbol)
79+
if new_entry:
80+
syms_to_add.append(symbol)
7081
sym_name_set.add(func["name"])
7182

7283
for addr, global_var in global_vars.items():
@@ -75,7 +86,10 @@ def update_symbols(self):
7586
if clean_name in sym_name_set:
7687
continue
7788

78-
syms_to_add.append((clean_name, int(addr, 0), "object", global_var_size))
89+
symbol = (clean_name, int(addr,0), "object", global_var_size)
90+
new_entry = self._cache(symbol)
91+
if new_entry:
92+
syms_to_add.append(symbol)
7993

8094
try:
8195
self.symbol_mapper.add_native_symbols(syms_to_add)
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import unittest
2+
import sys
3+
from unittest.mock import Mock
4+
5+
sys.modules["gdb"] = Mock()
6+
from decomp2dbg import GDBDecompilerClient
7+
8+
9+
# run with python -m unittest gdb_client_test.TestGDBDecompilerClient
10+
11+
class TestGDBDecompilerClient(unittest.TestCase):
12+
def setUp(self) -> None:
13+
self._symbols = [
14+
("f1", 0x100, "function", 0x10),
15+
("f2", 0x200, "function", 0x10),
16+
("g1", 0x300, "object", 8),
17+
("g2", 0x400, "object", 8)
18+
]
19+
20+
self._c = GDBDecompilerClient(None)
21+
for s in self._symbols:
22+
self._c._cache(s)
23+
24+
def test_cache_new_entry(self):
25+
entry = ("new symbol f3", 0x500, "function", 0x10)
26+
is_new = self._c._cache(entry)
27+
self.assertEqual(is_new, True, "entry is not not new")
28+
29+
def test_cache_old_entry(self):
30+
existing = self._symbols[0]
31+
is_new = self._c._cache(existing)
32+
self.assertEqual(is_new, False, "entry is old, but cache func says it's new")

‎decomp2dbg/clients/gdb/symbol_mapper.py

+3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ def add_native_symbols(self, sym_info_list):
6262
return False
6363

6464
# info("{:d} symbols will be added".format(len(sym_info_list)))
65+
if len(sym_info_list) == 0:
66+
return True
67+
6568
self._delete_old_sym_files()
6669

6770
# add each symbol into a mass symbol commit

0 commit comments

Comments
 (0)
Please sign in to comment.