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.
Files changed (77) hide show
  1. {hilda-2.0.6 → hilda-2.0.10}/PKG-INFO +30 -27
  2. {hilda-2.0.6 → hilda-2.0.10}/README.md +29 -26
  3. {hilda-2.0.6 → hilda-2.0.10}/hilda/_version.py +2 -2
  4. {hilda-2.0.6 → hilda-2.0.10}/hilda/cli.py +1 -1
  5. {hilda-2.0.6 → hilda-2.0.10}/hilda/hilda_client.py +33 -2
  6. {hilda-2.0.6 → hilda-2.0.10}/hilda/ipython_extensions/keybindings.py +1 -0
  7. {hilda-2.0.6 → hilda-2.0.10}/hilda/launch_lldb.py +22 -0
  8. {hilda-2.0.6 → hilda-2.0.10}/hilda/symbol.py +7 -0
  9. {hilda-2.0.6 → hilda-2.0.10}/hilda/symbols_jar.py +4 -4
  10. {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/PKG-INFO +30 -27
  11. {hilda-2.0.6 → hilda-2.0.10}/.github/workflows/python-app.yml +0 -0
  12. {hilda-2.0.6 → hilda-2.0.10}/.github/workflows/python-publish.yml +0 -0
  13. {hilda-2.0.6 → hilda-2.0.10}/.gitignore +0 -0
  14. {hilda-2.0.6 → hilda-2.0.10}/.pre-commit-config.yaml +0 -0
  15. {hilda-2.0.6 → hilda-2.0.10}/LICENSE +0 -0
  16. {hilda-2.0.6 → hilda-2.0.10}/gifs/.gitattributes +0 -0
  17. {hilda-2.0.6 → hilda-2.0.10}/gifs/ui.png +0 -0
  18. {hilda-2.0.6 → hilda-2.0.10}/gifs/xpc_print_message.gif +0 -0
  19. {hilda-2.0.6 → hilda-2.0.10}/hilda/__init__.py +0 -0
  20. {hilda-2.0.6 → hilda-2.0.10}/hilda/__main__.py +0 -0
  21. {hilda-2.0.6 → hilda-2.0.10}/hilda/common.py +0 -0
  22. {hilda-2.0.6 → hilda-2.0.10}/hilda/exceptions.py +0 -0
  23. {hilda-2.0.6 → hilda-2.0.10}/hilda/hilda_ascii_art.html +0 -0
  24. {hilda-2.0.6 → hilda-2.0.10}/hilda/ipython_extensions/events.py +0 -0
  25. {hilda-2.0.6 → hilda-2.0.10}/hilda/ipython_extensions/magics.py +0 -0
  26. {hilda-2.0.6 → hilda-2.0.10}/hilda/lldb_entrypoint.py +0 -0
  27. {hilda-2.0.6 → hilda-2.0.10}/hilda/lldb_importer.py +0 -0
  28. {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/from_ns_to_json.m +0 -0
  29. {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/get_objectivec_class_by_module.m +0 -0
  30. {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/get_objectivec_class_description.m +0 -0
  31. {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/get_objectivec_symbol_data.m +0 -0
  32. {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/lsof.m +0 -0
  33. {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c/to_ns_from_json.m +0 -0
  34. {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c_class.py +0 -0
  35. {hilda-2.0.6 → hilda-2.0.10}/hilda/objective_c_symbol.py +0 -0
  36. {hilda-2.0.6 → hilda-2.0.10}/hilda/registers.py +0 -0
  37. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/__init__.py +0 -0
  38. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/boringssl.py +0 -0
  39. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/collections.py +0 -0
  40. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/dyld.py +0 -0
  41. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/fs_utils.py +0 -0
  42. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/mach/CFRunLoopServiceMachPort_hooks.py +0 -0
  43. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/mach/__init__.py +0 -0
  44. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/__init__.py +0 -0
  45. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/all_image_infos.py +0 -0
  46. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/apple_version.py +0 -0
  47. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/image_info.py +0 -0
  48. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/macho.py +0 -0
  49. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/macho/macho_load_commands.py +0 -0
  50. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/remotepairingd.py +0 -0
  51. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/syslog.py +0 -0
  52. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/uuid.py +0 -0
  53. {hilda-2.0.6 → hilda-2.0.10}/hilda/snippets/xpc.py +0 -0
  54. {hilda-2.0.6 → hilda-2.0.10}/hilda/ui/colors.json +0 -0
  55. {hilda-2.0.6 → hilda-2.0.10}/hilda/ui/ui_manager.py +0 -0
  56. {hilda-2.0.6 → hilda-2.0.10}/hilda/ui/views.py +0 -0
  57. {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/SOURCES.txt +0 -0
  58. {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/dependency_links.txt +0 -0
  59. {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/entry_points.txt +0 -0
  60. {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/requires.txt +0 -0
  61. {hilda-2.0.6 → hilda-2.0.10}/hilda.egg-info/top_level.txt +0 -0
  62. {hilda-2.0.6 → hilda-2.0.10}/pyproject.toml +0 -0
  63. {hilda-2.0.6 → hilda-2.0.10}/requirements.txt +0 -0
  64. {hilda-2.0.6 → hilda-2.0.10}/setup.cfg +0 -0
  65. {hilda-2.0.6 → hilda-2.0.10}/tests/__init__.py +0 -0
  66. {hilda-2.0.6 → hilda-2.0.10}/tests/conftest.py +0 -0
  67. {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_from_ns.py +0 -0
  68. {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_hilda_client.py +0 -0
  69. {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_monitor.py +0 -0
  70. {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_ns.py +0 -0
  71. {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_rebind_symbols.py +0 -0
  72. {hilda-2.0.6 → hilda-2.0.10}/tests/test_hilda_client/test_registers.py +0 -0
  73. {hilda-2.0.6 → hilda-2.0.10}/tests/test_snippets/test_xpc.py +0 -0
  74. {hilda-2.0.6 → hilda-2.0.10}/tests/test_symbols/test_objective_c_class.py +0 -0
  75. {hilda-2.0.6 → hilda-2.0.10}/tests/test_symbols/test_objective_c_symbol.py +0 -0
  76. {hilda-2.0.6 → hilda-2.0.10}/tests/test_symbols/test_symbol.py +0 -0
  77. {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.6
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
- will print register values
215
+ will print register values
215
216
 
216
- Available formats:
217
- x: hex
218
- s: string
219
- cf: use CFCopyDescription() to get more informative description of the object
220
- po: use LLDB po command
221
- User defined function, will be called like `format_function(hilda_client, value)`.
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
- For example:
224
- regs={'x0': 'x'} -> x0 will be printed in HEX format
225
- expr={lldb_expression: format}
226
- lldb_expression can be for example '$x0' or '$arg1'
227
- format behaves just like 'regs' option
228
- retval=format
229
- Print function's return value. The format is the same as regs format.
230
- stop=True
231
- force a stop at every hit
232
- bt=True
233
- print backtrace
234
- cmd=[cmd1, cmd2]
235
- run several LLDB commands, one by another
236
- force_return=value
237
- force a return from function with the specified value
238
- name=some_value
239
- use `some_name` instead of the symbol name automatically extracted from the calling frame
240
- override=True
241
- override previous break point at same location
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
- will print register values
158
+ will print register values
158
159
 
159
- Available formats:
160
- x: hex
161
- s: string
162
- cf: use CFCopyDescription() to get more informative description of the object
163
- po: use LLDB po command
164
- User defined function, will be called like `format_function(hilda_client, value)`.
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
- For example:
167
- regs={'x0': 'x'} -> x0 will be printed in HEX format
168
- expr={lldb_expression: format}
169
- lldb_expression can be for example '$x0' or '$arg1'
170
- format behaves just like 'regs' option
171
- retval=format
172
- Print function's return value. The format is the same as regs format.
173
- stop=True
174
- force a stop at every hit
175
- bt=True
176
- print backtrace
177
- cmd=[cmd1, cmd2]
178
- run several LLDB commands, one by another
179
- force_return=value
180
- force a return from function with the specified value
181
- name=some_value
182
- use `some_name` instead of the symbol name automatically extracted from the calling frame
183
- override=True
184
- override previous break point at same location
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
 
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '2.0.6'
16
- __version_tuple__ = version_tuple = (2, 0, 6)
15
+ __version__ = version = '2.0.10'
16
+ __version_tuple__ = version_tuple = (2, 0, 10)
@@ -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(name)
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 Show.
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
- symbol = hilda.breakpoints[bp.id].address # type: Symbol
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
- args_c = args.copy()
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
- args_c['regs'] = {f'x{i + 2}': 'po' for i in range(arg_count)}
149
- name = args_c.get('name', name)
150
- address.monitor(name=name, **args_c)
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.6
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
- will print register values
215
+ will print register values
215
216
 
216
- Available formats:
217
- x: hex
218
- s: string
219
- cf: use CFCopyDescription() to get more informative description of the object
220
- po: use LLDB po command
221
- User defined function, will be called like `format_function(hilda_client, value)`.
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
- For example:
224
- regs={'x0': 'x'} -> x0 will be printed in HEX format
225
- expr={lldb_expression: format}
226
- lldb_expression can be for example '$x0' or '$arg1'
227
- format behaves just like 'regs' option
228
- retval=format
229
- Print function's return value. The format is the same as regs format.
230
- stop=True
231
- force a stop at every hit
232
- bt=True
233
- print backtrace
234
- cmd=[cmd1, cmd2]
235
- run several LLDB commands, one by another
236
- force_return=value
237
- force a return from function with the specified value
238
- name=some_value
239
- use `some_name` instead of the symbol name automatically extracted from the calling frame
240
- override=True
241
- override previous break point at same location
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