2010-01-13 32 views
11

Trước tiên hãy để tôi nói rằng tôi đến từ một nền tảng trong Flash/AS3, mà tôi nhận ra không phải là nghiêm ngặt về hầu hết mọi thứ như iPhone/Objective-C.Tại sao EXC_BAD_ACCESS lại vô ích đến vậy?

Tôi nghi ngờ câu hỏi của mình thực sự cũng áp dụng cho AS3, nhưng hãy để tôi hỏi nó liên quan đến Obj-c. Tại sao lỗi EXC_BAD_ACCESS và những người khác như vậy, vô ích? Tôi nhận ra rằng nó thường có nghĩa là quản lý sai bộ nhớ ở đâu đó, nhưng tại sao nó không thể cho bạn biết thêm về vấn đề này. Ví dụ tại sao nó không nói "EXC_BAD_ACCESS, bạn đã cố gắng vượt qua con trỏ như vậyAndSuch trên dòng 123, tuy nhiên bạn là một thằng ngốc, bởi vì bạn phát hành nó trên dòng 69 vì vậy nó không có sẵn nữa"?

Tôi nhận thấy tôi có thể sử dụng trình gỡ lỗi để có thêm manh mối về nơi xảy ra lỗi của tôi, nhưng nhiều lần điều này chỉ hữu ích một chút. Ví dụ: đôi khi không có thư nào trong ngăn xếp/chuỗi/bất kỳ mã nào thậm chí là mã của tôi. Lần khác nó là mã của tôi nhưng trên đầu trang của ngăn xếp sẽ là một tin nhắn có 4 + thông số, ok nhờ trình gỡ lỗi bạn thu hẹp nó xuống 4 con trỏ có thể bởi lý do tại sao bạn không thể chỉ cho tôi biết cái nào !?

Tôi đoán chỉ có một số giải thích cơ bản mà tôi đã bỏ lỡ vì nền tảng đến từ tôi, không cần phải lo lắng về bộ nhớ và như vậy. Mặc dù có một lỗi có thể xảy ra rất nhiều trong việc phát triển AS3 cũng không kém phần bí ẩn và cùng các dòng. "Lỗi # 1009: Không thể truy cập thuộc tính hoặc phương thức của tham chiếu đối tượng rỗng" gần như luôn luôn có nghĩa là biến mà bạn mong đợi đang giữ thứ gì đó thực sự là rỗng. Tại sao nó không cho tôi biết biến WHICH ?!

+0

Sử dụng và theo liên kết sau: http://www.touch-code-magazine.com/how-to-debug-exc_bad_access/ Hy vọng nó sẽ giải quyết được vấn đề của bạn. – shah

Trả lời

18

Vì thời gian chạy của mục tiêu-C là khá nhỏ và đơn giản, có chủ đích. Bạn đang thực tế mã hóa một ứng dụng bản địa đang ngồi ngay trên kim loại. Các ứng dụng không có ý tưởng tại sao bạn có một EXC_BAD_ACCESS, tất cả nó biết là bạn đã cố gắng để làm một cái gì đó và hệ điều hành nói không. EXC_BAD_ACCESS có nghĩa là bạn đang cố gắng truy cập vào không gian bộ nhớ mà hệ điều hành không cung cấp cho bạn.

Trong Flash, Java, .NET, v.v. có một thời gian chạy mạnh mẽ, mạnh mẽ đang chờ bạn chạy ứng dụng của bạn. Nó có nhiều bối cảnh hơn và biết nhiều hơn về những gì đang diễn ra. Vì vậy, một lợi ích của một môi trường như thế này là thông báo lỗi rõ ràng hơn nhiều, thường là với một dấu vết ngăn xếp đầy đủ.

Xcode có thể giúp bạn, xem xét việc kết hợp các đối tượng của bạn. Thay vì deallocating chúng, họ sẽ trở thành zombie và hét lên giết người đẫm máu nếu bạn cố gắng sử dụng chúng một lần nữa. Điều này giúp xác định nguyên nhân.

Bạn cũng có thể muốn nhìn vào Technical Q&A hoặc Debugging Magic

+2

Để có cái nhìn chi tiết về zombie, hãy tìm kiếm NSZombieEnabled – Joost

+0

Cảm ơn Matt vì đã trở thành một trong số rất nhiều người dường như thực sự nắm bắt được tinh thần của câu hỏi của tôi. Như tôi đã đề cập, tôi biết có những công cụ để đưa tôi đi đúng hướng, tôi chỉ đơn giản là cố gắng hiểu tại sao tôi cần những công cụ bổ sung đó. Câu trả lời tốt! :) – Dustin

+0

Oh cảm ơn cho mẹo Zombie quá, mặc dù nó vẫn không cho tôi biết con trỏ theo tên ... – Dustin

0

lý do tại sao nó không thể cho bạn biết thêm về vấn đề này.

Vì không có nhiều thông tin hơn thế. Tất nhiên nó chỉ có thể theo dõi tất cả các loại thông tin gỡ lỗi, nhưng điều đó sẽ làm chậm chương trình xuống.

0

Ví dụ tại sao không nói "EXC_BAD_ACCESS, bạn đã cố gắng chuyển con trỏ như vậyVà trên dòng 123, tuy nhiên bạn là kẻ ngốc, vì bạn đã phát hành nó trên dòng 69 để không còn nữa"?

Hãy suy nghĩ về những gì sẽ xảy ra để theo dõi điều này mọi lúc. Chạy nó dưới một trình gỡ lỗi xem allocs và giải phóng nếu bạn muốn gỡ lỗi này.

Mặc dù có lỗi xảy ra rất nhiều trong phát triển AS3 cũng không kém phần bí ẩn và dọc theo cùng một dòng."Lỗi # 1009: Không thể truy cập thuộc tính hoặc phương thức của tham chiếu đối tượng rỗng" gần như luôn luôn có nghĩa là biến mà bạn mong đợi đang giữ thứ gì đó thực sự là rỗng. Tại sao nó không cho tôi biết biến WHICH ?!

Thời gian chạy không có mã nguồn của bạn.

Về cơ bản, điều này sẽ chuyển thành "Nếu bạn muốn gỡ lỗi mã, hãy chạy nó dưới trình gỡ lỗi".

0

Chạy qua trình gỡ lỗi. Khi bạn nhận được ngoại lệ EXC_BAD_ACCESS, kiểm tra backtrace và tại mỗi khung kiểm tra giá trị của các biến cục bộ. Ngoài ra, đặt một vài khẳng định ở đây và ở đó chỉ để đảm bảo giá trị là những gì bạn mong đợi họ được.

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