Skip to content

Commit c190e56

Browse files
Autorefresh Dev Documentation
1 parent 03c4152 commit c190e56

13 files changed

+70
-42
lines changed

dev/_modules/libdebug/architectures/aarch64/aarch64_stack_unwinder.html

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,10 @@ <h1>Source code for libdebug.architectures.aarch64.aarch64_stack_unwinder</h1><d
435435
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
436436

437437
<span class="kn">from</span> <span class="nn">libdebug.architectures.stack_unwinding_manager</span> <span class="kn">import</span> <span class="n">StackUnwindingManager</span>
438+
<span class="kn">from</span> <span class="nn">libdebug.liblog</span> <span class="kn">import</span> <span class="n">liblog</span>
438439

439440
<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
441+
<span class="kn">from</span> <span class="nn">libdebug.data.memory_map</span> <span class="kn">import</span> <span class="n">MemoryMap</span>
440442
<span class="kn">from</span> <span class="nn">libdebug.state.thread_context</span> <span class="kn">import</span> <span class="n">ThreadContext</span>
441443

442444

@@ -459,10 +461,18 @@ <h1>Source code for libdebug.architectures.aarch64.aarch64_stack_unwinder</h1><d
459461
<span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="p">,</span> <span class="s2">&quot;pc&quot;</span><span class="p">)</span>
460462

461463
<span class="n">frame_pointer</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="o">.</span><span class="n">x29</span>
462-
<span class="n">initial_link_register</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="o">.</span><span class="n">x30</span>
463-
<span class="n">stack_trace</span> <span class="o">=</span> <span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="o">.</span><span class="n">pc</span><span class="p">,</span> <span class="n">initial_link_register</span><span class="p">]</span>
464464

465465
<span class="n">vmaps</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">_internal_debugger</span><span class="o">.</span><span class="n">debugging_interface</span><span class="o">.</span><span class="n">maps</span><span class="p">()</span>
466+
<span class="n">initial_link_register</span> <span class="o">=</span> <span class="kc">None</span>
467+
468+
<span class="k">try</span><span class="p">:</span>
469+
<span class="n">initial_link_register</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_return_address</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">vmaps</span><span class="p">)</span>
470+
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
471+
<span class="n">liblog</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
472+
<span class="s2">&quot;Failed to get the return address. Check stack frame registers (e.g., base pointer). The stack trace may be incomplete.&quot;</span><span class="p">,</span>
473+
<span class="p">)</span>
474+
475+
<span class="n">stack_trace</span> <span class="o">=</span> <span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="o">.</span><span class="n">pc</span><span class="p">,</span> <span class="n">initial_link_register</span><span class="p">]</span> <span class="k">if</span> <span class="n">initial_link_register</span> <span class="k">else</span> <span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="o">.</span><span class="n">pc</span><span class="p">]</span>
466476

467477
<span class="c1"># Follow the frame chain</span>
468478
<span class="k">while</span> <span class="n">frame_pointer</span><span class="p">:</span>
@@ -489,16 +499,22 @@ <h1>Source code for libdebug.architectures.aarch64.aarch64_stack_unwinder</h1><d
489499

490500
<div class="viewcode-block" id="Aarch64StackUnwinder.get_return_address">
491501
<a class="viewcode-back" href="../../../../libdebug.architectures.aarch64.html#libdebug.architectures.aarch64.aarch64_stack_unwinder.Aarch64StackUnwinder.get_return_address">[docs]</a>
492-
<span class="k">def</span> <span class="nf">get_return_address</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">Aarch64StackUnwinder</span><span class="p">,</span> <span class="n">target</span><span class="p">:</span> <span class="n">ThreadContext</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
502+
<span class="k">def</span> <span class="nf">get_return_address</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">Aarch64StackUnwinder</span><span class="p">,</span> <span class="n">target</span><span class="p">:</span> <span class="n">ThreadContext</span><span class="p">,</span> <span class="n">vmaps</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">MemoryMap</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
493503
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the return address of the current function.</span>
494504

495505
<span class="sd"> Args:</span>
496506
<span class="sd"> target (ThreadContext): The target ThreadContext.</span>
507+
<span class="sd"> vmaps (list[MemoryMap]): The memory maps of the process.</span>
497508

498509
<span class="sd"> Returns:</span>
499510
<span class="sd"> int: The return address.</span>
500511
<span class="sd"> &quot;&quot;&quot;</span>
501-
<span class="k">return</span> <span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="o">.</span><span class="n">x30</span></div>
512+
<span class="n">return_address</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="o">.</span><span class="n">x30</span>
513+
514+
<span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">vmap</span><span class="o">.</span><span class="n">start</span> <span class="o">&lt;=</span> <span class="n">return_address</span> <span class="o">&lt;</span> <span class="n">vmap</span><span class="o">.</span><span class="n">end</span> <span class="k">for</span> <span class="n">vmap</span> <span class="ow">in</span> <span class="n">vmaps</span><span class="p">):</span>
515+
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Return address not in any valid memory map&quot;</span><span class="p">)</span>
516+
517+
<span class="k">return</span> <span class="n">return_address</span></div>
502518
</div>
503519

504520
</pre></div>

dev/_modules/libdebug/architectures/amd64/amd64_stack_unwinder.html

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -435,13 +435,13 @@ <h1>Source code for libdebug.architectures.amd64.amd64_stack_unwinder</h1><div c
435435
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
436436

437437
<span class="kn">from</span> <span class="nn">libdebug.architectures.stack_unwinding_manager</span> <span class="kn">import</span> <span class="n">StackUnwindingManager</span>
438-
<span class="kn">from</span> <span class="nn">libdebug.liblog</span> <span class="kn">import</span> <span class="n">logging</span>
438+
<span class="kn">from</span> <span class="nn">libdebug.liblog</span> <span class="kn">import</span> <span class="n">liblog</span>
439439

440440
<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
441+
<span class="kn">from</span> <span class="nn">libdebug.data.memory_map</span> <span class="kn">import</span> <span class="n">MemoryMap</span>
441442
<span class="kn">from</span> <span class="nn">libdebug.state.thread_context</span> <span class="kn">import</span> <span class="n">ThreadContext</span>
442443

443444

444-
445445
<div class="viewcode-block" id="Amd64StackUnwinder">
446446
<a class="viewcode-back" href="../../../../libdebug.architectures.amd64.html#libdebug.architectures.amd64.amd64_stack_unwinder.Amd64StackUnwinder">[docs]</a>
447447
<span class="k">class</span> <span class="nc">Amd64StackUnwinder</span><span class="p">(</span><span class="n">StackUnwindingManager</span><span class="p">):</span>
@@ -484,25 +484,29 @@ <h1>Source code for libdebug.architectures.amd64.amd64_stack_unwinder</h1><div c
484484
<span class="c1"># If we are in the prolouge of a function, we need to get the return address from the stack</span>
485485
<span class="c1"># using a slightly more complex method</span>
486486
<span class="k">try</span><span class="p">:</span>
487-
<span class="n">first_return_address</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_return_address</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
487+
<span class="n">first_return_address</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_return_address</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">vmaps</span><span class="p">)</span>
488488

489-
<span class="k">if</span> <span class="n">first_return_address</span> <span class="o">!=</span> <span class="n">stack_trace</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
490-
<span class="n">stack_trace</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">first_return_address</span><span class="p">)</span>
489+
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">stack_trace</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
490+
<span class="k">if</span> <span class="n">first_return_address</span> <span class="o">!=</span> <span class="n">stack_trace</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
491+
<span class="n">stack_trace</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">first_return_address</span><span class="p">)</span>
492+
<span class="k">else</span><span class="p">:</span>
493+
<span class="n">stack_trace</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">first_return_address</span><span class="p">)</span>
491494
<span class="k">except</span> <span class="p">(</span><span class="ne">OSError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
492-
<span class="n">logging</span><span class="o">.</span><span class="n">WARNING</span><span class="p">(</span>
493-
<span class="s2">&quot;Failed to get the return address from the stack. Check stack frame registers (e.g., base pointer). The stack trace may be incomplete.&quot;</span><span class="p">,</span>
495+
<span class="n">liblog</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
496+
<span class="s2">&quot;Failed to get the return address. Check stack frame registers (e.g., base pointer). The stack trace may be incomplete.&quot;</span><span class="p">,</span>
494497
<span class="p">)</span>
495498

496499
<span class="k">return</span> <span class="n">stack_trace</span></div>
497500

498501

499502
<div class="viewcode-block" id="Amd64StackUnwinder.get_return_address">
500503
<a class="viewcode-back" href="../../../../libdebug.architectures.amd64.html#libdebug.architectures.amd64.amd64_stack_unwinder.Amd64StackUnwinder.get_return_address">[docs]</a>
501-
<span class="k">def</span> <span class="nf">get_return_address</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">Amd64StackUnwinder</span><span class="p">,</span> <span class="n">target</span><span class="p">:</span> <span class="n">ThreadContext</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
504+
<span class="k">def</span> <span class="nf">get_return_address</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">Amd64StackUnwinder</span><span class="p">,</span> <span class="n">target</span><span class="p">:</span> <span class="n">ThreadContext</span><span class="p">,</span> <span class="n">vmaps</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">MemoryMap</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
502505
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the return address of the current function.</span>
503506

504507
<span class="sd"> Args:</span>
505508
<span class="sd"> target (ThreadContext): The target ThreadContext.</span>
509+
<span class="sd"> vmaps (list[MemoryMap]): The memory maps of the process.</span>
506510

507511
<span class="sd"> Returns:</span>
508512
<span class="sd"> int: The return address.</span>
@@ -519,7 +523,12 @@ <h1>Source code for libdebug.architectures.amd64.amd64_stack_unwinder</h1><div c
519523
<span class="k">else</span><span class="p">:</span>
520524
<span class="n">return_address</span> <span class="o">=</span> <span class="n">target</span><span class="o">.</span><span class="n">memory</span><span class="p">[</span><span class="n">target</span><span class="o">.</span><span class="n">regs</span><span class="o">.</span><span class="n">rsp</span> <span class="o">+</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="s2">&quot;absolute&quot;</span><span class="p">]</span>
521525

522-
<span class="k">return</span> <span class="nb">int</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">return_address</span><span class="p">,</span> <span class="n">byteorder</span><span class="o">=</span><span class="s2">&quot;little&quot;</span><span class="p">)</span></div>
526+
<span class="n">return_address</span> <span class="o">=</span> <span class="nb">int</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">return_address</span><span class="p">,</span> <span class="n">byteorder</span><span class="o">=</span><span class="s2">&quot;little&quot;</span><span class="p">)</span>
527+
528+
<span class="k">if</span> <span class="ow">not</span> <span class="nb">any</span><span class="p">(</span><span class="n">vmap</span><span class="o">.</span><span class="n">start</span> <span class="o">&lt;=</span> <span class="n">return_address</span> <span class="o">&lt;</span> <span class="n">vmap</span><span class="o">.</span><span class="n">end</span> <span class="k">for</span> <span class="n">vmap</span> <span class="ow">in</span> <span class="n">vmaps</span><span class="p">):</span>
529+
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Return address not in any valid memory map&quot;</span><span class="p">)</span>
530+
531+
<span class="k">return</span> <span class="n">return_address</span></div>
523532

524533

525534
<span class="k">def</span> <span class="nf">_preamble_state</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">Amd64StackUnwinder</span><span class="p">,</span> <span class="n">instruction_window</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>

dev/_modules/libdebug/architectures/stack_unwinding_manager.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ <h1>Source code for libdebug.architectures.stack_unwinding_manager</h1><div clas
436436
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TYPE_CHECKING</span>
437437

438438
<span class="k">if</span> <span class="n">TYPE_CHECKING</span><span class="p">:</span>
439+
<span class="kn">from</span> <span class="nn">libdebug.data.memory_map</span> <span class="kn">import</span> <span class="n">MemoryMap</span>
439440
<span class="kn">from</span> <span class="nn">libdebug.state.thread_context</span> <span class="kn">import</span> <span class="n">ThreadContext</span>
440441

441442

@@ -454,7 +455,7 @@ <h1>Source code for libdebug.architectures.stack_unwinding_manager</h1><div clas
454455
<div class="viewcode-block" id="StackUnwindingManager.get_return_address">
455456
<a class="viewcode-back" href="../../../libdebug.architectures.html#libdebug.architectures.stack_unwinding_manager.StackUnwindingManager.get_return_address">[docs]</a>
456457
<span class="nd">@abstractmethod</span>
457-
<span class="k">def</span> <span class="nf">get_return_address</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">StackUnwindingManager</span><span class="p">,</span> <span class="n">target</span><span class="p">:</span> <span class="n">ThreadContext</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
458+
<span class="k">def</span> <span class="nf">get_return_address</span><span class="p">(</span><span class="bp">self</span><span class="p">:</span> <span class="n">StackUnwindingManager</span><span class="p">,</span> <span class="n">target</span><span class="p">:</span> <span class="n">ThreadContext</span><span class="p">,</span> <span class="n">vmaps</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">MemoryMap</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
458459
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the return address of the current function.&quot;&quot;&quot;</span></div>
459460
</div>
460461

dev/_modules/libdebug/ptrace/ptrace_interface.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ <h1>Source code for libdebug.ptrace.ptrace_interface</h1><div class="highlight">
764764
<span class="n">invalidate_process_cache</span><span class="p">()</span>
765765
<span class="k">elif</span> <span class="n">heuristic</span> <span class="o">==</span> <span class="s2">&quot;backtrace&quot;</span><span class="p">:</span>
766766
<span class="c1"># Breakpoint to return address</span>
767-
<span class="n">last_saved_instruction_pointer</span> <span class="o">=</span> <span class="n">thread</span><span class="o">.</span><span class="n">current_return_address</span><span class="p">()</span>
767+
<span class="n">last_saved_instruction_pointer</span> <span class="o">=</span> <span class="n">thread</span><span class="o">.</span><span class="n">saved_ip</span>
768768

769769
<span class="c1"># If a breakpoint already exists at the return address, we don&#39;t need to set a new one</span>
770770
<span class="n">found</span> <span class="o">=</span> <span class="kc">False</span>

0 commit comments

Comments
 (0)