Cách đáng tin cậy để làm cho ứng dụng iOS bị sập là gì?


136

Tôi muốn kiểm tra báo cáo sự cố ứng dụng của mình trong trường bằng cách cố tình gặp sự cố khi người dùng thực hiện một hành động cụ thể mà người dùng thực không có khả năng vô tình làm.

Nhưng đâu là cách đáng tin cậy để làm cho ứng dụng bị sập mà không tạo ra cảnh báo tại thời điểm biên dịch?

Chỉnh sửa: Lưu ý rằng nhiều câu trả lời dường như rõ ràng cho câu hỏi này dẫn đến các trường hợp ngoại lệ bị bắt bởi Cacao và do đó không dẫn đến sự cố ứng dụng.


Tôi đang nhận được WebKit discarded an uncaught exceptioncho tất cả những ý tưởng cho đến nay! Ai biết được rất khó để làm cho một ứng dụng sụp đổ những ngày này?
Nestor

Tôi không nghĩ bất kỳ thứ gì trong số này có liên quan đến WebKit ...
BoltClock

23
Đúng, mở Safari trên iPad 1 và duyệt đến một trang có nhiều hình ảnh. Luôn luôn làm việc cho tôi. : /
Alan B

4
(void)0/0;,(void)*(char*)0;
Kevin

1
Hãy cẩn thận với một số câu trả lời ở đây gọi hành vi không xác định . Đó thực sự là lời khuyên rất khó chịu!
usr

Câu trả lời:


140

trong Objective-C sử dụng C trực tiếp để gây ra truy cập xấu

strcpy(0, "bla");

Lưu ý: mặc dù điều này hoạt động trên bất kỳ hệ thống nào tôi biết - trong phiên bản tương lai của thời gian chạy C HOẶC trình biên dịch, điều này có thể không dẫn đến sự cố nữa. xem Có phải hành vi không xác định con trỏ null trong Objective-C không? )

(trong swift bạn sẽ phải cầu nối với objC để làm điều này)


Đây là IMHO một cách đáng tin cậy nhất
Michał Kreft

À vâng, điều đó cũng xoay quanh WebKit discarded an uncaught exceptionvấn đề.
Nestor

vẫn còn một lỗi đánh máy: D no @ "bla" nhưng "bla"
Daij-Djan

4
Rõ ràng ( stackoverflow.com/questions/13651642/ Mạnh ), đây là hành vi không xác định và thực sự là một câu trả lời rất tệ! Trình biên dịch có thể tối ưu hóa hợp pháp cả hai câu lệnh và không làm gì cả. Tôi đề nghị bạn xóa câu trả lời này. Nó có thể dẫn mọi người thực sự làm điều này.
usr

3
trên ios và osx và các cửa sổ và làm lại nó luôn bị sập nên trong bối cảnh cụ thể, tôi sẽ nói nó hợp lệ. Tôi sẽ thêm từ chối trách nhiệm
Daij-Djan

97

Yêu thích hiện tại của tôi:

assert(! "crashing on purpose to test <insert your reason here>");

Một cổ điển:

kill( getpid(), SIGABRT );

Và một số pr0n:

*(long*)0 = 0xB16B00B5;

Tất cả chúng tạo ra các sự cố được ghi lại bởi công cụ báo cáo sự cố của tôi.


14
khẳng định không gặp sự cố trên các phiên bản phát hành, đó là lý do tại sao đó là một sự khẳng định
DarthMike

6
nó phụ thuộc vào cài đặt bản dựng của bạn; Ngoài ra, tôi nghĩ rằng câu hỏi là về thử nghiệm, có vẻ ổn khi tiếp tục khẳng định trong các bản dựng thử nghiệm
djromero

3
Rất nhiều người (bao gồm cả tôi) để lại các xác nhận trong các bản dựng phát hành. Không có lý do để vô hiệu hóa chúng.
Sulthan

5
@Sulthan: assert()là một tính năng gỡ lỗi, không có ý nghĩa gì khi để lại hành trình như vậy trong các bản dựng phát hành. Có những bài kiểm tra đơn vị cho điều đó.
MestreLion

18
IMHO assertkhông phải là một tính năng gỡ lỗi. Một khẳng định thất bại là một lỗi bạn nghĩ không thể. Thà hủy bỏ, thậm chí là một bản phát hành, hơn là tiếp tục chạy một chương trình với những hậu quả khó lường.
djromero

27

Vì tất cả chúng ta đều sử dụng Clang cho iOS, điều này khá đáng tin cậy:

__builtin_trap();

Điều này có lợi ích là nó được thiết kế cho chính xác mục đích này, vì vậy nó không nên tạo ra bất kỳ cảnh báo hoặc lỗi trình biên dịch nào.



22

Làm thế nào về một tràn ngăn xếp cũ tốt :)

- (void)stackOverflow
{
    [self stackOverflow];
}

16

Phổ biến nhất - sự cố bộ chọn không được nhận dạng:

NSObject *object = [[NSObject alloc] init];
[object performSelector:@selector(asfd)];

Hãy chắc chắn rằng bạn không có phương thức -asdf được triển khai trong lớp đó haha

Hoặc chỉ mục vượt quá ngoại lệ ràng buộc:

NSArray * array = [NSArray array];
[array objectAtIndex:5];

Và tất nhiên kill( getpid(), SIGABRT );


12

Tôi nghĩ rằng trong Swift bạn có thể dễ dàng đưa ra một lỗi nghiêm trọng:

func foo() {
    fatalError("crash!")
}

Nó thực sự thậm chí còn có ý định sử dụng tính năng này trong trường hợp có sự cố xảy ra để làm cho ứng dụng bị sập.

Để tránh một câu lệnh if trong trường hợp đặc biệt, bạn cũng có thể sử dụng precondition. Nó tương tự như vậy assert, làm cho ý định (nếu muốn) khá rõ ràng và không bị xóa trong bản phát hành cuối cùng như assert. Nó được sử dụng như thế nào precondition(myBoolean, "This is a helpful error message for debugging.").


9

Gửi tin nhắn đến một đối tượng bị hủy


34
Điều này thực sự rất không đáng tin cậy. Bạn vẫn có thể gửi tin nhắn đến các đối tượng được giải phóng miễn là bộ nhớ của chúng không được sử dụng lại. Đây là toàn bộ lý do mọi người trong lịch sử đã rất khó khăn để gỡ lỗi lỗi phát hành kép. Chỉ khi bộ nhớ được thu hồi bởi một đối tượng khác thì việc gửi tin nhắn có thể gây ra ngoại lệ.
Mike Weller

7
exit(0);

(phải ... nhập ... 30 ký tự)


Cảm ơn các upvote nhưng trên thực tế, điều này sẽ khiến ứng dụng chấm dứt và quay trở lại Springboard, mặc dù bản thân nó có thể hữu ích, không phải là điều OP muốn, mà là để kích hoạt một ngoại lệ chưa được xử lý
Steve Rogers

6

Bạn cũng có thể đưa ra một ngoại lệ:

[NSException raise:NSInternalInconsistencyException
            format:@"I want to test app crashes!."];

2
Tôi không nghĩ ngoại lệ là cách tốt, bắt ngoại lệ là phổ biến để bạn có thể vô tình bắt được. Bắt tín hiệu không quá phổ biến nên việc truy cập xấu hoặc những thứ tương tự sẽ đáng tin cậy hơn. :)
Michał Kreft

3

Thêm một trình nhận dạng cử chỉ vào chế độ xem nhận dạng một lần chạm 10 ngón tay (5 ngón tay cho iPhone vì 10 có thể hơi đông). GR có một phương thức được đính kèm để thực thi bất kỳ ai trong số các cách chắc chắn đã đề cập trước đó để khiến ứng dụng của bạn gặp sự cố. Hầu hết người dùng sẽ không đặt 10 ngón tay xuống ứng dụng của bạn, vì vậy bạn an toàn trước người dùng chung vô tình gây ra sự cố.

Tuy nhiên, bạn sẽ có thể sử dụng một cái gì đó như Testflight hoặc chỉ triển khai nó cho các thiết bị cá nhân và thử nghiệm trước khi gửi nó cho Apple. Có một sự cố bắt buộc có thể khiến ứng dụng của bạn bị Apple từ chối.


Ứng dụng Cocos2d của tôi gặp sự cố khi tôi thực hiện đa chạm và tôi đã gặp phải lỗi đó chưa được khắc phục. Tôi không có GR, nhưng tôi đã kích hoạt cảm ứng đa điểm trong Cocos2d. Tôi có trải nghiệm sự cố mà bạn mô tả? Bạn có nghĩa là đây là hành vi mong đợi / mong muốn?
Fredrik Johansson

@Fredrik Tôi không nghĩ rằng bạn gặp sự cố mà bạn đang mô tả (dự kiến ​​sẽ không xảy ra sự cố IMO và cá nhân tôi không nghĩ rằng nên cố tình đưa một ứng dụng vào ứng dụng của mình cho vấn đề đó). Bạn có thể thử tượng trưng cho sự cố và tìm hiểu chính xác phương pháp nào khiến ứng dụng bị sập. Nó có thể là một cái gì đó bên trong khung Cocos2d gây ra sự cố khi 'đa chạm cực đoan' xảy ra. Nếu đó là trường hợp thì đặt cược tốt nhất của bạn là gửi một lỗi với những kẻ Cocos2d.
jrczer

2

có thể thử một cái gì đó như

NSArray* crashingArray = [NSArray arrayWithCapacity:1];
[crashingArray release];

sẽ gặp sự cố trên EXC_BAD_ACCESS (có thể cần phải phát hành lại lần thứ hai nhưng bình thường nó sẽ bị sập như thế này)


3
Không biên dịch với ARC được kích hoạt.
vikingosegundo

tốt, nếu bạn sử dụng ARC, bạn cũng có thể làm điều này: NSArray * crashingArray = [NSArray mảngWithCapacity: 1]; [crashingArray objectAt Index: 0]; cái này sẽ bị
sập

1

Tôi sẽ đi với:int raise(int sig);

Để biết thêm thông tin >man raise


0

Tôi sẽ chỉ giết quá trình bình thường:

kill(getpid(), SIGKILL);

Vì vậy, nếu bạn cài đặt một trình xử lý với tín hiệu, bạn cũng có thể xử lý sự cố, hoàn thiện để ghi các tệp đã mở và những thứ này.


điều này đã được bao gồm trong câu trả lời của
madmw

0

tôi sử dụng

[self doesNotRecognizeSelector:_cmd]; 

2
Bài đăng này đang được tự động gắn cờ là chất lượng thấp vì nó chỉ là mã. Bạn có muốn mở rộng nó bằng cách thêm một số văn bản để giải thích tại sao điều này giải quyết vấn đề?
gung - Phục hồi Monica

0

Khi làm việc với RubyMotion tôi sử dụng điều này:

    n=Pointer.new ('c', 1)
    n[1000] ='h'

0

Thử cái này:

- (IBAction)Button:(id)sender
{
    NSArray *array = [NSArray new];
    NSLog(@"%@",[array objectAtIndex:8]);
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.