2013-01-09 40 views
5

Tôi vừa phát hiện ra this tính năng tiện dụng của LLDB cho phép tôi viết các tập lệnh Python có quyền truy cập vào các biến trong khung khi tôi đang ở điểm ngắt trong LLDB. Tuy nhiên tôi đang gặp một vài vấn đề khi sử dụng nó trong Xcode (v4.5.2). Thứ nhất, tôi không thể tìm thấy bất cứ nơi nào mà nói nơi tôi nên giữ các kịch bản Python để tôi có thể nhập chúng từ dòng lệnh trong LLDB. Thứ hai, sau khi tôi gõ script vào LLDB, đầu vào bàn phím sẽ hơi sai: backspace không xóa ký tự trên màn hình, nhưng xóa nó một cách hiệu quả khỏi lệnh. Vì vậy, gõ primt<bsp><bsp><bsp>int có nghĩa là print, nhưng nó vẫn xuất hiện dưới dạng primtint trên thiết bị đầu cuối. Đây chỉ là thẩm mỹ nhưng nó khá khó chịu!Kịch bản Python LLDB trong Xcode

Mọi người có thể chỉ cho tôi một số tài nguyên cụ thể của Xcode để sử dụng Python bằng LLDB không?

EDIT: Here là một liên kết thú vị khác cho biết bạn có thể sử dụng Python để tạo tóm tắt tùy chỉnh cho các biến bằng Python, nhưng tôi không thể tìm thấy bất kỳ điều gì liên quan đến biến đó.

Trả lời

13

Giữa Xcode, lldb và trình thông dịch Python có một số vấn đề với bảng điều khiển tương tác. Vui lòng gửi báo cáo lỗi tại số http://bugreport.apple.com/ - Tôi không biết liệu có báo cáo lỗi về vấn đề cụ thể này chưa, mặc dù các vấn đề nói chung ở đây được biết đến. Bạn có thể muốn sử dụng công cụ dòng lệnh lldb nếu bạn đang khám phá giao diện kịch bản lệnh python tương tác; hoạt động tốt hơn.

Tôi đặt tất cả các tập lệnh python của tôi cho lldb trong ~/lldb. Trong tập tin ~/.lldbinit tôi nguồn họ. Ví dụ, tôi có ~/lldb/stopifcaller.py đó là

import lldb 

# Use this like 
# (lldb) command script import ~/lldb/stopifcaller.py 
# (lldb) br s -n bar 
# (lldb) br comm add --script-type python -o "stopifcaller.stop_if_caller(frame, 'foo')" 1 

def stop_if_caller(current_frame, function_of_interest): 
    thread = current_frame.GetThread() 
    if thread.GetNumFrames() > 1: 
    if thread.GetFrameAtIndex(1).GetFunctionName() != function_of_interest: 
     thread.GetProcess().Continue() 

Tôi sẽ đưa command script import trong tập tin ~/.lldbinit tôi để tải nó tự động, nếu đó là những gì tôi muốn. Ví dụ cụ thể này thêm lệnh python vào điểm ngắt # 1 - khi lldb dừng tại điểm ngắt, nó sẽ xem xét hàm gọi. Nếu chức năng gọi không phải là foo, chức năng này sẽ tự động tiếp tục thực hiện. Về bản chất, breakpoint 1 sẽ chỉ dừng lại nếu foo() gọi bar(). Lưu ý rằng có thể có vấn đề với Xcode 4.5 lldb khi thực hiện command script import ~/... - bạn có thể cần nhập đường dẫn đầy đủ vào thư mục chính của mình (/Users/benwad/ hoặc bất kỳ thứ gì). Tôi không thể nhớ chắc chắn - có một vài vấn đề mở rộng dấu ngã với Xcode 4.5 đã được sửa trong một thời gian.

Bạn có thể thêm tóm tắt loại đơn giản trực tiếp vào số ~/.lldbinit của mình. Ví dụ, nếu tôi đang gỡ lỗi lldb, thì đối tượng ConstString chỉ có một trường mà tôi quan tâm, m_string ivar.Vì vậy, tôi có

type summary add -w lldb lldb_private::ConstString -s "${var.m_string}" 

Hoặc nếu đó là loại addr_t, tôi luôn luôn muốn điều đó được định dạng như hex vì vậy tôi có

type format add -f x lldb::addr_t 

Nếu bạn muốn thêm một lệnh mới để LLĐB, bạn sẽ có một con trăn nộp như ~/lldb/sayhello.py,

import lldb 

def say_hello(debugger, command, result, dict): 
    print 'hello' 

def __lldb_init_module (debugger, dict): 
    debugger.HandleCommand('command script add -f sayhello.say_hello hello') 

và bạn sẽ tải nó vào LLĐB như

(lldb) comma script import ~/lldb/sayhello.py 
(lldb) hello 
hello 
(lldb) 

Hầu hết thời gian khi bạn thêm lệnh được viết bằng python, bạn sẽ sử dụng các thư viện shlexoptparse để lệnh có thể thực hiện phân tích tùy chọn và bạn sẽ thêm một chuỗi __doc__. ví dụ đơn giản.

+0

Cảm ơn! Thông tin rất hữu ích để tôi bắt đầu. – benwad

+0

Bạn không xảy ra để có một repo github với 'lldb'' python' đoạn của bạn làm bạn? (Tôi nhìn và không nhìn thấy một ... ưa thích bắt đầu một?) Tôi nghĩ rằng nó rất thú vị. – trojanfoe

+5

Tôi nghĩ chúng ta thực sự cần thêm tài liệu theo kiểu sách dạy nấu ăn vào trang web lldb với một tập hợp các vấn đề đơn giản và giải pháp của họ - đó có lẽ là nơi tốt nhất cho loại điều này. Thiếu thời gian. :( –

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