2017-06-12 6 views
7

मैं अपने मैक पर सिएरा 10.12.4 के साथ x64 असेंबली लिखने और डीबग करने में सक्षम होना चाहता हूं। कोई सोचता है कि यह विशेष रूप से कठिन या अस्पष्ट इच्छा नहीं होगी, लेकिन कई घंटों के प्रयासों के बावजूद और ऑनलाइन खोज करने के बावजूद मैं सफल नहीं हुआ हूं और मुझे कोई और नहीं मिला है।मैक ओएस पर x64 असेंबली डीबग करना संभव है?

मैं NASM असेंबलर का उपयोग करना पसंद करूंगा, लेकिन अगर मुझे करना है तो जीएएस या इंटेल सिंटैक्स के साथ कुछ भी उपयोग करेगा। (वैसे, ध्यान दें कि सी फाइलों के साथ दोनों gdb और lldb काम ठीक जीसीसी के साथ संकलित।)

यहाँ मेरी स्थिति है और क्या मैं कोशिश की है:

एनएएसएम

काम नहीं करता है मैं एक फ़ाइल को इकट्ठा और लिंक कर सकता हूं और इसे सत्यापित करता हूं।

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

लेकिन मैं इसे gdb (ध्यान दें कि मैं सभी आवश्यक codesigning बकवास क्या किया) के साथ डिबग नहीं कर सकते हैं:

$ 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. 

और मैं यह 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. 

गैस काम नहीं करता है

मैं, इकट्ठा कर सकते हैं लिंक, और चलाएँ:

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

लेकिन मैं 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] 

(। तो यह सिर्फ भाग गया और ब्रेकप्वाइंट पर ध्यान नहीं दिया)

और मैं यह 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. 

जो चीजें मुझे ऑनलाइन मिली हैं

Here मैक ओएस के नए संस्करणों पर काम नहीं कर रहे gdb पर एक ब्लॉग पोस्ट है।

कुछ पुराने संबंधित स्टैक ओवरफ्लो प्रश्न हैं, जिनमें से कोई भी पर्याप्त उत्तर प्रदान नहीं करता है।

this way to use Xcode भी है, जो चमत्कारी रूप से काम करता प्रतीत होता है ... लेकिन वास्तव में यह वही नहीं करता जो मैं चाहता हूं। डीबगर वास्तव में मेरी स्रोत फ़ाइल के बारे में पता नहीं है; यह सिर्फ निर्देशों के माध्यम से कदम उठा रहा है और अलग कोड या कुछ प्रदर्शित कर रहा है। इसके अलावा मैं एक्सकोड का उपयोग नहीं करना चाहता।

मैंने कुछ महीने पहले NASM मेलिंग सूची पर इसके बारे में पूछा और किसी ने कभी जवाब नहीं दिया।

तो ...

तो यह वर्तमान में सबसे बुनियादी बातें एक व्यक्ति एक कंप्यूटर Mac का उपयोग करके के साथ क्या करना चाहते हो सकता है की एक करने के लिए असंभव है?

अगर किसी के पास ऐसा करने का कोई तरीका है, तो कृपया मुझे बिल्कुल आवश्यक आदेश दिखाएं। चमत्कार की

+0

'nasm' का कौन सा संस्करण? 'Gdb' का क्या संस्करण, 'llvm'? –

+0

मैंने nasm संस्करण 2.13.01 और 2.14rc0, और gdb संस्करण 7.12.1 और 8.0 का प्रयास किया है। lldb-370.0.42। ऐप्पल llvm संस्करण 8.1.0। मुझे संस्करण के बावजूद एक ही परिणाम मिलते हैं। क्या आप इस सॉफ्टवेयर के कुछ संस्करणों के साथ काम करने के लिए डिबगिंग प्राप्त कर रहे हैं? –

+0

मैं नस्ल 2.13 रिलीज नोट का जिक्र कर रहा हूं: "माचो ऑब्जेक्ट प्रारूप अब नए टूलचेन द्वारा आवश्यक बौने डीबगिंग प्रारूप का समर्थन करता है।" लेकिन आपने संकेत दिया है कि आप नवीनतम पर हैं। क्या आपने नासम मंच पर पूछा था? –

उत्तर

1

चमत्कार है, यह मैं बजना साथ ऐसा कर सकते लगता है: दुर्भाग्य से जहाँ तक

$ 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 

के रूप में मैं बता सकता हूँ बजना के 64 विधानसभा समर्थन पूरी तरह से गैर-दस्तावेजी है, और मैं सही मंत्र पता लगा कि यह केवल करने के लिए प्रयोग करके। लेकिन यह कुछ है, मुझे लगता है।

+0

मुझे नहीं पता कि क्लैंग असेंबलर के लिए दस्तावेज़ कहां ढूंढना है, लेकिन एक्सकोड के पास llvm असेंबली स्रोत को प्रदर्शित करने का विकल्प है सी/सी ++/ओबीजेसी स्रोत फ़ाइल (उत्पाद-> कार्य करें-> इकट्ठा करें)। इससे आपको ऐसे ही परिचालनों के उदाहरण मिल सकते हैं जिन्हें आप अपने उद्देश्यों के लिए पालना कर सकते हैं। –

संबंधित मुद्दे