File: TestUnregisteredMacho.py

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (63 lines) | stat: -rw-r--r-- 2,412 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""Test that debugserver will parse a mach-o in inferior memory even if it's not loaded."""

import os
import re
import subprocess

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class TestUnregisteredMacho(TestBase):
    # newer debugserver required for jGetLoadedDynamicLibrariesInfos
    # to support this
    @skipIfOutOfTreeDebugserver
    @no_debug_info_test
    @skipUnlessDarwin
    def test(self):
        self.build()
        target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(
            self, "// break here", lldb.SBFileSpec("main.c")
        )

        frame = thread.GetFrameAtIndex(0)
        macho_buf = frame.GetValueForVariablePath("macho_buf")
        macho_addr = macho_buf.GetValueAsUnsigned()
        invalid_macho_addr = macho_buf.GetValueAsUnsigned() + 4
        gdb_packet = (
            "process plugin packet send 'jGetLoadedDynamicLibrariesInfos:{\"solib_addresses\":[%d]}]'"
            % macho_addr
        )

        # Send the jGetLoadedDynamicLibrariesInfos packet
        # to debugserver, asking it to parse the mach-o binary
        # at this address and give us the UUID etc, even though
        # dyld doesn't think there is a binary at that address.
        # We won't get a pathname for the binary (from dyld), but
        # we will get to the LC_UUID and include that.
        self.expect(
            gdb_packet,
            substrs=['"pathname":""', '"uuid":"1B4E28BA-2FA1-11D2-883F-B9A761BDE3FB"'],
        )

        no_macho_gdb_packet = (
            "process plugin packet send 'jGetLoadedDynamicLibrariesInfos:{\"solib_addresses\":[%d]}]'"
            % invalid_macho_addr
        )
        self.expect(no_macho_gdb_packet, substrs=['response: {"images":[]}'])

        # Test that we get back the information for the properly
        # formatted Mach-O binary in memory, but do not get an
        # entry for the invalid Mach-O address.
        both_gdb_packet = (
            "process plugin packet send 'jGetLoadedDynamicLibrariesInfos:{\"solib_addresses\":[%d,%d]}]'"
            % (macho_addr, invalid_macho_addr)
        )
        self.expect(both_gdb_packet, substrs=['"load_address":%d,' % macho_addr])
        self.expect(
            both_gdb_packet,
            substrs=['"load_address":%d,' % invalid_macho_addr],
            matching=False,
        )