Ist es möglich, debug x64-Montage auf Mac OS?

Ich würde gerne in der Lage sein, zu schreiben und zu Debuggen x64 Montage auf meinem Mac mit Sierra 10.12.4. Man würde denken, dies wäre nicht eine besonders schwierige oder unklare Lust, aber trotz viele Stunden Aufwand und eine Menge online-Suche habe ich nicht geschafft, und ich habe nicht gefunden, sonst jemand, der hat entweder.

Ich würde lieber mit den NASM-assembler, aber wir werden GAS oder irgendetwas mit Intel-syntax, wenn ich muss. (By the way, beachten Sie, dass beide gdb und lldb, funktionieren mit C-Dateien kompiliert mit gcc.)

Hier ist meine situation und was ich versucht habe:

NASM nicht funktioniert

Kann ich zusammenbauen und verlinken einer Datei und überprüfen ob es funktioniert.

$ nasm -f macho64 -g -F dwarf hello2.s -o hello2.o
$ gcc hello2.o -o hello2
$ ./hello2
Hello, world!

Aber ich kann nicht Debuggen mit gdb (beachten Sie, dass ich nicht alle erforderlichen Mitgestaltung Unsinn):

$ gdb hello2
GNU gdb (GDB) 8.0
<snip>
Reading symbols from hello2...done.
(gdb) list
1   section .data
2
3   msg: db "Hello, world!", 0
4
5   section .text
6       global _main
7       extern _puts
8
9   _main:
10      push    rbp
(gdb) break 10
Breakpoint 1 at 0x0: file hello2.s, line 10.
(gdb) run
Starting program: /Users/mike/GoogleDrive/Projects/Sort/hello2
[New Thread 0x1403 of process 38022]
warning: unhandled dyld version (15)
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x0

Command aborted.

Und ich kann nicht Debuggen mit lldb:

$ lldb hello2
(lldb) target create "hello2"
Current executable set to 'hello2' (x86_64).
(lldb) b hello2.s:10
Breakpoint 1: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.

GAS funktioniert nicht

Kann ich zusammenstellen, verknüpfen und ausführen:

$ gcc -g hello.s -o hello
$ ./hello
Hello, world!

Aber ich kann nicht Debuggen mit gdb:

$ gdb hello
GNU gdb (GDB) 8.0
<snip>
Reading symbols from hello...Reading symbols from /Users/mike/GoogleDrive/Projects/Sort/hello.dSYM/Contents/Resources/DWARF/hello...done.
done.
(gdb) list
1   .intel_syntax
2   .text
3       .globl _main
4
5   _main:
6       push    rbp
7       mov rbp, rsp
8       lea rdi, [rip + _main.S_0]
9       call    _puts
10      mov rax, 0
(gdb) break 6
No line 6 in the current file.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (6) pending.
(gdb) run
Starting program: /Users/mike/GoogleDrive/Projects/Sort/hello
[New Thread 0x1403 of process 38063]
warning: unhandled dyld version (15)
Hello, world!
[Inferior 1 (process 38063) exited normally]

(Also es lief einfach und ignoriert den Haltepunkt.)

Und ich kann nicht Debuggen mit lldb:

$ lldb hello
(lldb) target create "hello"
Current executable set to 'hello' (x86_64).
(lldb) b hello.s:6
Breakpoint 1: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.

Dinge, die ich im Netz gefunden habe

Hier ist ein blog-post über gdb funktioniert nicht auf neue Versionen von Mac OS.

Gibt es ein paar alte Verwandte StackOverflow-Fragen, von denen keine adäquate Antwort.

Gibt es auch diese Art der Verwendung von Xcode, die wie durch ein Wunder scheint zu funktionieren… aber es hat nicht wirklich tun, was ich will. Der debugger ist nicht wirklich bewusst, von meiner Quell-Datei; es ist nur ein Schritt durch die Anweisungen und anzeigen disassemblierten code oder so etwas. Ich möchte auch nicht XCode verwenden.

Fragte ich, über diese auf das NASM-mailing-Liste vor ein paar Monaten, und niemand antwortete.

So…

So ist es derzeit unmöglich zu tun eine der grundlegendsten Dinge, die eine person vielleicht möchten Sie mit einem computer tun Verwendung eines Mac?

Wenn jemand eine Möglichkeit hat, dies zu tun, zeige mir bitte genau die notwendigen Befehle.

  • Welche version von nasm? Welche version von gdb, llvm?
  • Ich habe versucht, nasm-Versionen 2.13.01 und 2.14rc0 und gdb-Versionen 7.12.1 und 8.0. lldb-370.0.42. Apple llvm version 8.1.0. Ich bekomme die gleichen Ergebnisse, unabhängig von der version. Willst du damit sagen Sie habe mich debugging-arbeiten mit irgendeiner version von dieser software?
  • Ich spreche hier von den nasm 2.13 release Hinweis: „Das macho-Objekt-format unterstützt nun auch das dwarf-debugging-format, wie erforderlich, durch neuere toolchains.“ aber Sie habe angegeben, Sie sind auf dem neuesten Stand ist. Haben Sie Fragen, auf die nasm-forum???
  • Ich fragte auf der nasm-mailing-Liste, aber nicht das forum…
  • Ich kann deine Frage nicht beantworten, weil ich noch nie genutzt habe GDB auf einem Mac, aber dein Einwand mit Xcode ein wenig ungewöhnlich scheint. „Der debugger ist nicht wirklich bewusst, von meiner Quell-Datei; es ist nur ein Schritt durch die Anweisungen und anzeigen disassemblierten code oder so etwas.“ Sie schreiben in der Montage, bro. Den disassemblierten code sieht genau so aus wie Ihre Quell-Datei!
  • Nicht wirklich. Zum Beispiel, ich kann nicht legen Sie einen Haltepunkt in einer bestimmten Zeile. Beschriftungen nicht richtig sein. Etc.
  • OK, ich habe jetzt gebucht, eine Frage, an der nasm-forum auch.
  • Ich beobachte das forum aus egoistischen Gründen, ich habe Schruppen es mit lldb als gut.
  • Eine zusätzliche Bemerkung: ich habe versucht, dies alles auch unter Linux. Dort Debuggen mit GAS und gdb funktioniert. Aber NASM und gdb nicht. In der Tat, es stellt sich heraus, NASM noch nicht gearbeitet, mit GDB in fast 5 Jahren. Siehe diese [1] bug-report. Ich kann auch mehrere NASM Beiträge im forum mit nicht Antworten zu diesem Thema. Ich bin nicht sicher, es ist möglich, Programme zu Debuggen, montiert mit NASM auf jeder Plattform. [1] bugzilla.nasm.us/show_bug.cgi?id=3392234



One Reply
  1. 4

    Wunder der Wunder, es scheint, ich kann dies mit clang:

    $ clang -g -c -x assembler hello.s
    $ clang hello.o -o hello
    $ ./hello
    Hello, world!
    $ lldb hello
    (lldb) target create "hello"
    Current executable set to 'hello' (x86_64).
    (lldb) b hello.s:10
    Breakpoint 1: where = hello`main + 16, address = 0x0000000100000f7c
    (lldb) run
    Process 40460 launched: '/Users/mike/GoogleDrive/Projects/Sort/hello' (x86_64)
    Hello, world!
    Process 40460 stopped
    * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
        frame #0: 0x0000000100000f7c hello`main at hello.s:10
       7        mov rbp, rsp
       8        lea rdi, [rip + _main.S_0]
       9        call    _puts
    -> 10       mov rax, 0
       11       mov rsp, rbp
       12       pop rbp
       13       ret
    

    Leider so weit ich es sagen kann, ertönt x64 assembly support komplett Undokumentiert, und ich dachte, die richtigen Beschwörungen zu tun dieses nur durch Experimentieren. Aber es ist etwas, denke ich.

    • Ich weiß nicht, wo finden Sie die Dokumentation für den clang-assembler, aber Xcode hat eine option zum anzeigen der llvm-assembly Quelle für eine C/C++/ObjC-source-Datei (Produkt->Aktion Ausführen->Montieren). Das könnte Ihnen Beispiele von ähnlichen Operationen, können Sie die Krippe für Ihre Zwecke.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.