hilda 2.0.6__tar.gz → 2.0.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hilda-2.0.6 → hilda-2.0.10}/PKG-INFO +30 -27
- {hilda-2.0.6 → hilda-2.0.10}/README.md +29 -26
- {hilda-2.0.6 → hilda-2.0.10}/hilda/_version.py +2 -2
- {hilda-2.0.6 → hilda-2.0.10}/hilda/cli.py +1 -1
- {hilda-2.0.6 → hilda-2.0.10}/hilda/hilda_client.py +33 -2
- {hilda-2.0.6 → hilda-2.0.10}/hilda/ipython_extensions/keybindings.py +1 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/launch_lldb.py +22 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/symbol.py +7 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/symbols_jar.py +4 -4
- {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/PKG-INFO +30 -27
- {hilda-2.0.6 → hilda-2.0.10}/.github/workflows/python-app.yml +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/.github/workflows/python-publish.yml +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/.gitignore +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/.pre-commit-config.yaml +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/LICENSE +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/gifs/.gitattributes +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/gifs/ui.png +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/gifs/xpc_print_message.gif +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/__init__.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/__main__.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/common.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/exceptions.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/hilda_ascii_art.html +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/ipython_extensions/events.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/ipython_extensions/magics.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/lldb_entrypoint.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/lldb_importer.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/from_ns_to_json.m +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/get_objectivec_class_by_module.m +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/get_objectivec_class_description.m +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/get_objectivec_symbol_data.m +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/lsof.m +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/to_ns_from_json.m +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c_class.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c_symbol.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/registers.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/__init__.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/boringssl.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/collections.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/dyld.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/fs_utils.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/mach/CFRunLoopServiceMachPort_hooks.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/mach/__init__.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/__init__.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/all_image_infos.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/apple_version.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/image_info.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/macho.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/macho_load_commands.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/remotepairingd.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/syslog.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/uuid.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/xpc.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/ui/colors.json +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/ui/ui_manager.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda/ui/views.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/SOURCES.txt +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/dependency_links.txt +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/entry_points.txt +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/requires.txt +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/top_level.txt +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/pyproject.toml +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/requirements.txt +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/setup.cfg +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/__init__.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/conftest.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_from_ns.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_hilda_client.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_monitor.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_ns.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_rebind_symbols.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_registers.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_snippets/test_xpc.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_symbols/test_objective_c_class.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_symbols/test_objective_c_symbol.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_symbols/test_symbol.py +0 -0
- {hilda-2.0.6 → hilda-2.0.10}/tests/test_symbols/test_symbols_jar.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: hilda
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.10
|
|
4
4
|
Summary: LLDB wrapped and empowered by iPython's features
|
|
5
5
|
Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>, netanel cohen <netanelc305@protonmail.com>
|
|
6
6
|
Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>, netanel cohen <netanelc305@protonmail.com>
|
|
@@ -207,38 +207,39 @@ Here is a gist of methods you can access from `p`:
|
|
|
207
207
|
- Call function at given address with given parameters
|
|
208
208
|
- `monitor`
|
|
209
209
|
- Monitor every time a given address is called
|
|
210
|
+
|
|
210
211
|
The following options are available:
|
|
211
212
|
|
|
212
213
|
```
|
|
213
214
|
regs={reg1: format}
|
|
214
|
-
|
|
215
|
+
will print register values
|
|
215
216
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
217
|
+
Available formats:
|
|
218
|
+
x: hex
|
|
219
|
+
s: string
|
|
220
|
+
cf: use CFCopyDescription() to get more informative description of the object
|
|
221
|
+
po: use LLDB po command
|
|
222
|
+
User defined function, will be called like `format_function(hilda_client, value)`.
|
|
222
223
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
224
|
+
For example:
|
|
225
|
+
regs={'x0': 'x'} -> x0 will be printed in HEX format
|
|
226
|
+
expr={lldb_expression: format}
|
|
227
|
+
lldb_expression can be for example '$x0' or '$arg1'
|
|
228
|
+
format behaves just like 'regs' option
|
|
229
|
+
retval=format
|
|
230
|
+
Print function's return value. The format is the same as regs format.
|
|
231
|
+
stop=True
|
|
232
|
+
force a stop at every hit
|
|
233
|
+
bt=True
|
|
234
|
+
print backtrace
|
|
235
|
+
cmd=[cmd1, cmd2]
|
|
236
|
+
run several LLDB commands, one by another
|
|
237
|
+
force_return=value
|
|
238
|
+
force a return from function with the specified value
|
|
239
|
+
name=some_value
|
|
240
|
+
use `some_name` instead of the symbol name automatically extracted from the calling frame
|
|
241
|
+
override=True
|
|
242
|
+
override previous break point at same location
|
|
242
243
|
```
|
|
243
244
|
|
|
244
245
|
- `show_current_source`
|
|
@@ -305,6 +306,8 @@ Here is a gist of methods you can access from `p`:
|
|
|
305
306
|
- sets the currently selected thread, which is used in other parts of the program, such as displaying disassembly or
|
|
306
307
|
checking registers.
|
|
307
308
|
This ensures the application focuses on the specified thread for these operations.
|
|
309
|
+
- `wait_for_module`
|
|
310
|
+
- Wait for a module to be loaded (`dlopen`) by checking if given expression is contained within its filename
|
|
308
311
|
|
|
309
312
|
All these methods are available from the global `p` within the newly created IPython shell. In addition, you may invoke any of the exported APIs described in the [Python API](#python-api)
|
|
310
313
|
|
|
@@ -150,38 +150,39 @@ Here is a gist of methods you can access from `p`:
|
|
|
150
150
|
- Call function at given address with given parameters
|
|
151
151
|
- `monitor`
|
|
152
152
|
- Monitor every time a given address is called
|
|
153
|
+
|
|
153
154
|
The following options are available:
|
|
154
155
|
|
|
155
156
|
```
|
|
156
157
|
regs={reg1: format}
|
|
157
|
-
|
|
158
|
+
will print register values
|
|
158
159
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
Available formats:
|
|
161
|
+
x: hex
|
|
162
|
+
s: string
|
|
163
|
+
cf: use CFCopyDescription() to get more informative description of the object
|
|
164
|
+
po: use LLDB po command
|
|
165
|
+
User defined function, will be called like `format_function(hilda_client, value)`.
|
|
165
166
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
167
|
+
For example:
|
|
168
|
+
regs={'x0': 'x'} -> x0 will be printed in HEX format
|
|
169
|
+
expr={lldb_expression: format}
|
|
170
|
+
lldb_expression can be for example '$x0' or '$arg1'
|
|
171
|
+
format behaves just like 'regs' option
|
|
172
|
+
retval=format
|
|
173
|
+
Print function's return value. The format is the same as regs format.
|
|
174
|
+
stop=True
|
|
175
|
+
force a stop at every hit
|
|
176
|
+
bt=True
|
|
177
|
+
print backtrace
|
|
178
|
+
cmd=[cmd1, cmd2]
|
|
179
|
+
run several LLDB commands, one by another
|
|
180
|
+
force_return=value
|
|
181
|
+
force a return from function with the specified value
|
|
182
|
+
name=some_value
|
|
183
|
+
use `some_name` instead of the symbol name automatically extracted from the calling frame
|
|
184
|
+
override=True
|
|
185
|
+
override previous break point at same location
|
|
185
186
|
```
|
|
186
187
|
|
|
187
188
|
- `show_current_source`
|
|
@@ -248,6 +249,8 @@ Here is a gist of methods you can access from `p`:
|
|
|
248
249
|
- sets the currently selected thread, which is used in other parts of the program, such as displaying disassembly or
|
|
249
250
|
checking registers.
|
|
250
251
|
This ensures the application focuses on the specified thread for these operations.
|
|
252
|
+
- `wait_for_module`
|
|
253
|
+
- Wait for a module to be loaded (`dlopen`) by checking if given expression is contained within its filename
|
|
251
254
|
|
|
252
255
|
All these methods are available from the global `p` within the newly created IPython shell. In addition, you may invoke any of the exported APIs described in the [Python API](#python-api)
|
|
253
256
|
|
|
@@ -53,7 +53,7 @@ def attach(name: Optional[str], pid: Optional[int], startup_files: List[str]) ->
|
|
|
53
53
|
if name is not None:
|
|
54
54
|
hilda_client = create_hilda_client_using_attach_by_name(name)
|
|
55
55
|
elif pid is not None:
|
|
56
|
-
hilda_client = create_hilda_client_using_attach_by_pid(
|
|
56
|
+
hilda_client = create_hilda_client_using_attach_by_pid(pid)
|
|
57
57
|
else:
|
|
58
58
|
raise click.UsageError('You must specify a process name or pid')
|
|
59
59
|
hilda_client.interact(startup_files=startup_files)
|
|
@@ -58,7 +58,8 @@ GREETING = f"""
|
|
|
58
58
|
<b>Hilda has been successfully loaded! 😎
|
|
59
59
|
Usage:
|
|
60
60
|
<span style="color: magenta">p</span> Global to access all features.
|
|
61
|
-
<span style="color: magenta">F1</span> UI
|
|
61
|
+
<span style="color: magenta">F1</span> Show UI.
|
|
62
|
+
<span style="color: magenta">F2</span> Toggle enabling of stdout & stderr.
|
|
62
63
|
<span style="color: magenta">F7</span> Step Into.
|
|
63
64
|
<span style="color: magenta">F8</span> Step Over.
|
|
64
65
|
<span style="color: magenta">F9</span> Continue.
|
|
@@ -92,6 +93,8 @@ class Configs:
|
|
|
92
93
|
'doc': 'Whether to exclude NSObject during evaluation - reduce ipython autocomplete results.'})
|
|
93
94
|
objc_verbose_monitor: bool = field(default=False, metadata={
|
|
94
95
|
'doc': 'When set to True, using monitor() will automatically print objc methods arguments.'})
|
|
96
|
+
enable_stdout_stderr: bool = field(default=True, metadata={
|
|
97
|
+
'doc': 'When set to True, will enable process stdout and stderr.'})
|
|
95
98
|
|
|
96
99
|
def __repr__(self):
|
|
97
100
|
return self.__str__()
|
|
@@ -511,7 +514,8 @@ class HildaClient:
|
|
|
511
514
|
:param dict options: User defined options.
|
|
512
515
|
"""
|
|
513
516
|
bp = bp_loc.GetBreakpoint()
|
|
514
|
-
|
|
517
|
+
|
|
518
|
+
symbol = hilda.symbol(hilda.frame.addr.GetLoadAddress(hilda.target)) # type: Symbol
|
|
515
519
|
|
|
516
520
|
# by default, attempt to resolve the symbol name through lldb
|
|
517
521
|
name = str(symbol.lldb_symbol)
|
|
@@ -1043,6 +1047,24 @@ class HildaClient:
|
|
|
1043
1047
|
|
|
1044
1048
|
return value
|
|
1045
1049
|
|
|
1050
|
+
def wait_for_module(self, expression: str) -> None:
|
|
1051
|
+
""" Wait for a module to be loaded using `dlopen` by matching given expression """
|
|
1052
|
+
self.log_info(f'Waiting for module name containing "{expression}" to be loaded')
|
|
1053
|
+
|
|
1054
|
+
def bp(client: HildaClient, frame, bp_loc, options) -> None:
|
|
1055
|
+
loading_module_name = client.evaluate_expression('$arg1').peek_str()
|
|
1056
|
+
client.log_info(f'Loading module: {loading_module_name}')
|
|
1057
|
+
if expression not in loading_module_name:
|
|
1058
|
+
client.cont()
|
|
1059
|
+
return
|
|
1060
|
+
client.finish()
|
|
1061
|
+
client.log_info(f'Desired module has been loaded: {expression}. Process remains stopped')
|
|
1062
|
+
bp = bp_loc.GetBreakpoint()
|
|
1063
|
+
client.remove_hilda_breakpoint(bp.id)
|
|
1064
|
+
|
|
1065
|
+
self.bp('dlopen', bp)
|
|
1066
|
+
self.cont()
|
|
1067
|
+
|
|
1046
1068
|
def interact(self, additional_namespace: Optional[typing.Mapping] = None,
|
|
1047
1069
|
startup_files: Optional[List[str]] = None) -> None:
|
|
1048
1070
|
""" Start an interactive Hilda shell """
|
|
@@ -1070,6 +1092,10 @@ class HildaClient:
|
|
|
1070
1092
|
sys.argv = ['a']
|
|
1071
1093
|
IPython.start_ipython(config=ipython_config, user_ns=namespace)
|
|
1072
1094
|
|
|
1095
|
+
def toggle_enable_stdout_stderr(self, *args) -> None:
|
|
1096
|
+
self.configs.enable_stdout_stderr = not self.configs.enable_stdout_stderr
|
|
1097
|
+
self.logger.info(f'Changed stdout and stderr status to: {self.configs.enable_stdout_stderr}')
|
|
1098
|
+
|
|
1073
1099
|
def __enter__(self) -> 'HildaClient':
|
|
1074
1100
|
return self
|
|
1075
1101
|
|
|
@@ -1166,6 +1192,11 @@ class HildaClient:
|
|
|
1166
1192
|
else:
|
|
1167
1193
|
return f'{value:x} (unsupported format)'
|
|
1168
1194
|
|
|
1195
|
+
@cached_property
|
|
1196
|
+
def _object_identifier(self) -> Symbol:
|
|
1197
|
+
return self.symbols.objc_getClass('VMUObjectIdentifier').objc_call('alloc').objc_call(
|
|
1198
|
+
'initWithTask:', self.symbols.mach_task_self())
|
|
1199
|
+
|
|
1169
1200
|
@cached_property
|
|
1170
1201
|
def _ks(self) -> Optional['Ks']:
|
|
1171
1202
|
if not lldb.KEYSTONE_SUPPORT:
|
|
@@ -7,6 +7,7 @@ def load_ipython_extension(ipython):
|
|
|
7
7
|
def register_keybindings():
|
|
8
8
|
hilda = ipython.user_ns['p']
|
|
9
9
|
keys_mapping = {Keys.F1: hilda.ui_manager.show,
|
|
10
|
+
Keys.F2: hilda.toggle_enable_stdout_stderr,
|
|
10
11
|
Keys.F7: hilda.step_into,
|
|
11
12
|
Keys.F8: hilda.step_over,
|
|
12
13
|
Keys.F9: lambda _: (hilda.log_info('Sending continue'), hilda.cont()),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
|
+
import sys
|
|
3
4
|
from abc import ABC, abstractmethod
|
|
4
5
|
from threading import Thread
|
|
5
6
|
from typing import List, Optional
|
|
@@ -46,6 +47,20 @@ class LLDBListenerThread(Thread, ABC):
|
|
|
46
47
|
return
|
|
47
48
|
raise LLDBError(self.error.description)
|
|
48
49
|
|
|
50
|
+
def _process_stdout(self) -> None:
|
|
51
|
+
stdout = self.process.GetSTDOUT(1024)
|
|
52
|
+
while stdout:
|
|
53
|
+
if lldb.hilda_client is not None and lldb.hilda_client.configs.enable_stdout_stderr:
|
|
54
|
+
sys.stdout.write(stdout)
|
|
55
|
+
stdout = self.process.GetSTDOUT(1024)
|
|
56
|
+
|
|
57
|
+
def _process_stderr(self) -> None:
|
|
58
|
+
stderr = self.process.GetSTDERR(1024)
|
|
59
|
+
while stderr:
|
|
60
|
+
if lldb.hilda_client is not None and lldb.hilda_client.configs.enable_stdout_stderr:
|
|
61
|
+
sys.stderr.write(stderr)
|
|
62
|
+
stderr = self.process.GetSTDERR(1024)
|
|
63
|
+
|
|
49
64
|
def run(self):
|
|
50
65
|
event = lldb.SBEvent()
|
|
51
66
|
last_state = lldb.eStateStopped
|
|
@@ -54,6 +69,13 @@ class LLDBListenerThread(Thread, ABC):
|
|
|
54
69
|
continue
|
|
55
70
|
if not lldb.SBProcess.EventIsProcessEvent(event):
|
|
56
71
|
continue
|
|
72
|
+
|
|
73
|
+
event_type = event.GetType()
|
|
74
|
+
if event_type & lldb.SBProcess.eBroadcastBitSTDOUT:
|
|
75
|
+
self._process_stdout()
|
|
76
|
+
if event_type & lldb.SBProcess.eBroadcastBitSTDERR:
|
|
77
|
+
self._process_stderr()
|
|
78
|
+
|
|
57
79
|
state = self.process.GetStateFromEvent(event)
|
|
58
80
|
if state == lldb.eStateDetached:
|
|
59
81
|
logger.debug('Process Detached')
|
|
@@ -104,6 +104,13 @@ class Symbol(int):
|
|
|
104
104
|
"""
|
|
105
105
|
return self._client.symbols.CFCopyDescription(self).po()
|
|
106
106
|
|
|
107
|
+
@property
|
|
108
|
+
def name(self) -> str:
|
|
109
|
+
symbol_info = int(self._client.po(f'[{self._client._object_identifier} symbolForAddress:{self}]', '__int128'))
|
|
110
|
+
arg1 = symbol_info & 0xffffffffffffffff
|
|
111
|
+
arg2 = symbol_info >> 64
|
|
112
|
+
return self._client.symbols.CSSymbolGetName(arg1, arg2).peek_str()
|
|
113
|
+
|
|
107
114
|
@contextmanager
|
|
108
115
|
def change_item_size(self, new_item_size: int) -> None:
|
|
109
116
|
"""
|
|
@@ -139,15 +139,15 @@ class SymbolsJar(dict):
|
|
|
139
139
|
:param args: given arguments for monitor command
|
|
140
140
|
"""
|
|
141
141
|
for name, address in self.items():
|
|
142
|
-
|
|
142
|
+
options = args.copy()
|
|
143
143
|
if name == '_client':
|
|
144
144
|
continue
|
|
145
145
|
if self.__dict__['_client'].configs.objc_verbose_monitor:
|
|
146
146
|
arg_count = name.count(':')
|
|
147
147
|
if arg_count > 0:
|
|
148
|
-
|
|
149
|
-
name =
|
|
150
|
-
address.monitor(name=name, **
|
|
148
|
+
options['expr'] = {f'$arg{i + 3}': 'po' for i in range(arg_count)}
|
|
149
|
+
name = options.get('name', name)
|
|
150
|
+
address.monitor(name=name, **options)
|
|
151
151
|
|
|
152
152
|
def startswith(self, exp, case_sensitive=True):
|
|
153
153
|
"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: hilda
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.10
|
|
4
4
|
Summary: LLDB wrapped and empowered by iPython's features
|
|
5
5
|
Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>, netanel cohen <netanelc305@protonmail.com>
|
|
6
6
|
Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>, netanel cohen <netanelc305@protonmail.com>
|
|
@@ -207,38 +207,39 @@ Here is a gist of methods you can access from `p`:
|
|
|
207
207
|
- Call function at given address with given parameters
|
|
208
208
|
- `monitor`
|
|
209
209
|
- Monitor every time a given address is called
|
|
210
|
+
|
|
210
211
|
The following options are available:
|
|
211
212
|
|
|
212
213
|
```
|
|
213
214
|
regs={reg1: format}
|
|
214
|
-
|
|
215
|
+
will print register values
|
|
215
216
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
217
|
+
Available formats:
|
|
218
|
+
x: hex
|
|
219
|
+
s: string
|
|
220
|
+
cf: use CFCopyDescription() to get more informative description of the object
|
|
221
|
+
po: use LLDB po command
|
|
222
|
+
User defined function, will be called like `format_function(hilda_client, value)`.
|
|
222
223
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
224
|
+
For example:
|
|
225
|
+
regs={'x0': 'x'} -> x0 will be printed in HEX format
|
|
226
|
+
expr={lldb_expression: format}
|
|
227
|
+
lldb_expression can be for example '$x0' or '$arg1'
|
|
228
|
+
format behaves just like 'regs' option
|
|
229
|
+
retval=format
|
|
230
|
+
Print function's return value. The format is the same as regs format.
|
|
231
|
+
stop=True
|
|
232
|
+
force a stop at every hit
|
|
233
|
+
bt=True
|
|
234
|
+
print backtrace
|
|
235
|
+
cmd=[cmd1, cmd2]
|
|
236
|
+
run several LLDB commands, one by another
|
|
237
|
+
force_return=value
|
|
238
|
+
force a return from function with the specified value
|
|
239
|
+
name=some_value
|
|
240
|
+
use `some_name` instead of the symbol name automatically extracted from the calling frame
|
|
241
|
+
override=True
|
|
242
|
+
override previous break point at same location
|
|
242
243
|
```
|
|
243
244
|
|
|
244
245
|
- `show_current_source`
|
|
@@ -305,6 +306,8 @@ Here is a gist of methods you can access from `p`:
|
|
|
305
306
|
- sets the currently selected thread, which is used in other parts of the program, such as displaying disassembly or
|
|
306
307
|
checking registers.
|
|
307
308
|
This ensures the application focuses on the specified thread for these operations.
|
|
309
|
+
- `wait_for_module`
|
|
310
|
+
- Wait for a module to be loaded (`dlopen`) by checking if given expression is contained within its filename
|
|
308
311
|
|
|
309
312
|
All these methods are available from the global `p` within the newly created IPython shell. In addition, you may invoke any of the exported APIs described in the [Python API](#python-api)
|
|
310
313
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|