2012-04-17 51 views
14

Tôi đang phát triển trò chơi trên iOS bằng cách sử dụng khung công tác cocos2d và tôi rất ghen tị với khả năng lập trình mã Java của họ trong khi họ gỡ lỗi ứng dụng của họ (tức là thay đổi giá trị biến trong một phương thức và cập nhật chương trình trực tiếp nếu bạn có REPL mà không phải biên dịch lại). Điều này có vẻ giống như một cái gì đó sẽ hoàn toàn vô cùng hữu ích khi phát triển iOS, môi trường phát triển của tôi là (rõ ràng) Xcode và ngôn ngữ tôi lập trình là Mục tiêu C. Tôi đã googled xung quanh nhưng havent đã có thể tìm thấy bất cứ điều gì - vì vậy tôi nghĩ tôi sẽ hỏi cộng đồng.Trao đổi mã nóng trong Xcode?

Có ai biết nếu có cách nào để mã Hoán đổi nóng trong Xcode trong khi lập trình trong Mục tiêu C không?

Cảm ơn trước

+1

Xcode từng có này, nhưng IIRC nó còn chậm và không đáng tin cậy và mọi người chỉ không sử dụng nó, vì vậy của Apple giết tính năng tập trung vào chỉ làm cho trình gỡ lỗi tốt hơn. – Chuck

+0

Đó là một sự xấu hổ, bạn có biết bất kỳ tính năng gỡ lỗi nào cung cấp chức năng tương tự/tương đương không? Im cố gắng giảm số lần tôi thay đổi một biến và xây dựng lại và chạy chỉ để xem nếu số của nó đúng (dev trò chơi là rất nhiều thử và sai) – Salman

+0

Nếu nó trong một biến, bạn chỉ có thể chỉnh sửa giá trị của nó trong trình gỡ rối. –

Trả lời

11

Không thể với các công cụ hiện tại.

Hãy nhớ rằng các ứng dụng iOS được ký - nếu bạn thay đổi một byte đơn lẻ bạn đã từ chức toàn bộ. Người ta có thể tưởng tượng làm cho nó hoạt động bằng cách sử dụng hỗ trợ của thời gian chạy để tự động thêm và loại bỏ các phương thức. Nhưng điều đó chắc chắn sẽ yêu cầu thêm một số thứ bổ sung để hỗ trợ nó trên thiết bị và đó là điều mà phần mềm độc hại có thể dễ dàng tận dụng. Vì vậy, nó có thể không phải là một tính năng bạn sẽ có khả năng nhìn thấy bất cứ lúc nào sớm.

Nhân tiện, các phiên bản Xcode 1.x-3.x đã có tính năng "Khắc phục và tiếp tục". Bạn có thể chỉnh sửa khi bạn đang gỡ lỗi, sử dụng lệnh Khắc phục và Tiếp tục và tiếp tục chạy mã được cập nhật. Tôi tin rằng nó đã được gỡ bỏ tại một số điểm, có lẽ do một số sự kết hợp của: yêu cầu dự án của bạn được cấu hình để sử dụng "không liên kết" và có lẽ một số thứ khác; ít hơn đáng tin cậy; có lẽ không hỗ trợ iOS; chuyển sang llvm; những thay đổi khác trong Xcode 4. Có thể nó sẽ trở lại vào một ngày nào đó - nếu bạn muốn nó trở lại, hãy gửi một lỗi - nhưng một lần nữa, tôi nghĩ việc hỗ trợ nó trên iOS sẽ là một thách thức.

+0

Câu trả lời này có vẻ đã lỗi thời. @ bartosz-hernas [answer] (http://stackoverflow.com/a/16463529/273628) chỉ cho tôi hướng tới những gì có vẻ là một giải pháp tương thích XCode 7.1: [InjectionPlugin] (https://github.com/johnno1962/injectionforxcode). – ajh158

6

Nếu bạn chỉ nói về việc thay đổi giá trị biến thì bạn có thể đạt được điều đó lén lút qua lldb (hoặc, có lẽ) gdb. Giả sử bạn có:

- (void)uselessMethod 
{ 
    NSString *localString = @"I'm some local text"; 

    NSLog(@"%@", localString); 
} 

Và đặt một breakpoint trên NSLog, vào thời điểm mà bạn có thể hỏi LLĐB để đánh giá một giao lại của localString như một phương tiện để thực hiện nó. Ví dụ.

po localString = @"Hat" 

Nếu sau đó bạn cho phép thực hiện chương trình tiếp tục, bạn nên thấy rằng việc gán lại đã bị kẹt. Tương tự, bạn có thể gọi bất kỳ phương thức nào hoặc thực hiện bất kỳ loại nhiệm vụ nào khác.

Tôi vừa thử nghiệm điều này với Xcode 4.3.2.

+0

Vì vậy, những gì bạn đang nói là nó có thể trong terminal xCode (nếu im sử dụng lldb như trình biên dịch - hiện tại tôi đang sử dụng GDB nhưng chỉ vì đó là mặc định), nhưng điều này sẽ liên quan đến 1) một breakpoint được thiết lập, và 2) các lệnh được nhập vào thiết bị đầu cuối nếu chúng giải quyết được vấn đề, sau đó sẽ phải được chuyển sang mã thực tế theo cách thủ công. Tôi có hiểu điều này một cách chính xác không? – Salman

+0

Tôi hiểu bạn chỉ được hỏi về việc thay đổi các giá trị biến và tôi giả sử gdb hoạt động giống như lldb trong khía cạnh này. Nếu không tôi nghĩ rằng bạn là chính xác; bạn không thể chỉnh sửa và tiếp tục (theo thuật ngữ của Microsoft, để đảm bảo rằng tôi đã hiểu câu hỏi) theo như tôi biết. – Tommy

13

Có một plugin tuyệt vời cho phép thay đổi mã trong APP hoạt động, trực tiếp. Nó được gọi là InjectionPlugin.

Như FAQ nói:

Làm thế nào nó hoạt động? Thời gian chạy Objective-C cho phép bạn tải một phiên bản mới của một lớp vào một ứng dụng bằng cách sử dụng một gói ngay cả khi đã có một triển khai thực hiện được liên kết trong ứng dụng. Swizzling được sử dụng khi gói được nạp để chuyển đổi lớp hiện có để sử dụng các phương thức triển khai mới. Điều này có thể được thực hiện nhiều lần và hoạt động cho các ứng dụng OSX và iOS và trên các thiết bị iOS.

tôi thực hiện một số video nhỏ trong đó cho thấy làm thế nào để cài đặt và sử dụng plugin này http://nomtek.com/developers/how-to-install-and-use-injection-plugin-for-xcode/

Hy vọng nó sẽ giúp!

+0

Thật không may nó không hoạt động trên thiết bị với Xcode 5. – openfrog

1

Bạn có thể trao đổi nóng giá trị biến trong Xcode theo:

expression <variable> = <value>;.

Bằng cách có điểm ngắt ở nơi bạn muốn thay đổi giá trị và thực hiện lệnh trong bảng điều khiển Xcode.

Ví dụ:

// Messages From Console 
(lldb) expression graphFlag = @"X"; // Update variable value 
(__NSCFConstantString *) $0 = 0x36f95718 @"X" // Xcode prints the updated value 
(lldb) expression graphFlag; // Printing value through expression command 
(__NSCFConstantString *) $1 = 0x36f95718 @"X" // Hot Swapped variable value 
Các vấn đề liên quan