2013-10-04 17 views
11

Tôi đang sử dụng lldb bên trong Xcode và một trong các biến của tôi chứa một đoạn dữ liệu JSON lớn. Sử dụng po myVar không hữu ích lắm khi phân tích dữ liệu này, vì nó sẽ xuất ra trong bảng điều khiển gỡ rối Xcode nhỏ.Chuyển hướng đầu ra lldb thành tệp

Có cách nào để chuyển hướng đầu ra lldb sang tệp không?

tôi thấy here rằng một tính năng như vậy dường như có sẵn trên gdb như:

(gdb) set logging on 
(gdb) set logging file /tmp/mem.txt 
(gdb) x/512bx 0xbffff3c0 
(gdb) set logging off 

và được "dịch" trong LLĐB như:

(lldb) memory read --outfile /tmp/mem.txt --count 512 0xbffff3c0 
(lldb) me r -o/tmp/mem.txt -c512 0xbffff3c0 
(lldb) x/512bx -o/tmp/mem.txt 0xbffff3c0 

Tuy nhiên, lệnh memory read sẽ không trợ giúp trong trường hợp của tôi và --outfile dường như không khả dụng cho lệnh print.

Trả lời

11

Bạn có thể sử dụng một kịch bản Python để làm như vậy (và nhiều hơn nữa), như đã giải thích ở đây:

LLDB Python scripting in Xcode

Tạo một file có tên po.py trong một thư mục của sự lựa chọn của bạn (ví dụ như "~ /.lldb "):

import lldb 

def print_to_file(debugger, command, result, dict): 
    #Change the output file to a path/name of your choice 
    f=open("/Users/user/temp.txt","w") 
    debugger.SetOutputFileHandle(f,True); 
    #Change command to the command you want the output of 
    command = "po self" 
    debugger.HandleCommand(command) 

def __lldb_init_module (debugger, dict): 
    debugger.HandleCommand('command script add -f po.print_to_file print_to_file ') 

Sau đó, trong debug console viết:

comma script import ~/.lldb/po.py 
print_to_file 
+1

Cải tiến ở đây: tại sao không làm cho lệnh một cuộc tranh cãi - sau đó bạn có thể nói "print_to_file po self"? Ngoài ra, tôi đã không kiểm tra xem LLDB có tự động reset lại các chốt cho bạn hay không, nhưng có vẻ như thực hành tốt để đặt lại xử lý tệp đầu ra :) Cuối cùng, bạn có thể thực sự chỉ lấy SBCommandReturnObject cho 'lệnh kém hơn' (po self in the ví dụ) và ghi nó vào một tập tin thay vì cướp của stldout của lldb. Tôi thường sẽ cảnh giác với cố gắng để chơi xung quanh với stdin/stdout nếu ở tất cả có thể tránh được. –

+2

Có cách nào để chuyển hướng * tất cả * đầu ra trình gỡ rối vào một tệp không? Tôi đã thử tập lệnh ở trên mà không có dòng 'HandleCommand' và nó không hoạt động. – blackwing

+1

Enrico, bạn có thể xem xét hiển thị một ví dụ/câu trả lời của riêng bạn mà cải thiện này? Tôi thích âm thanh của cách tiếp cận của bạn nhưng tôi không có đủ thông tin để kiểm tra nó. – insitusec

0

Đây là một sửa đổi nhỏ kết hợp một số ý kiến ​​từ trên:

def toFile(debugger, command, result, dict): 
    f=open("/Users/user/temp.txt","w") 
    debugger.SetOutputFileHandle(f,True); 
    debugger.HandleCommand(command) 
    f.close() 
    debugger.SetOutputFileHandle(sys.stdout, True) 

Điều này cho phép các lệnh để được cung cấp như một cuộc tranh cãi, và trở lại trạng các tập tin đầu ra xử lý để thiết bị xuất chuẩn sau khi lệnh được chạy.

Các vấn đề liên quan