Чтобы показать окно отладки, нужно нажать на кнопку Hide or show the Debug area
в правом верхнем углу экрана.
Окно отладки появляется самостоятельно в следующих случаях:
- когда программа пытается получить доступ к участку памяти, который ей не принадлежит;
- когда выполняется деление целых чисел на 0;
- когда выполняется доступ к объекту, который уже был освобожден (released) или обработан сборщиком мусора (garbage collected) - так называемые dangling pointers.
В предыдущем проекте SimpleCalc в файле BTSAppDelegate.m определим константу:
#import "BTSAppDelegate.h"
#define D_SHOW_DIVIDEBYZERO_BUG 1
В том же файле изменим объявление переменных:
#if D_SHOW_DIVIDEBYZERO_BUG
int l_value1 = [mValue1 doubleValue];
int l_value2 = [mValue2 doubleValue];
#else
// Get a double precision number from the
// first text field
double l_value1 = [mValue1 doubleValue];
// Get a double precision number from the
// second text field
double l_value2 = [mValue2 doubleValue];
// Create a double precision variable to
// hold the result of l_value1 <op> l_value2
#endif
Это называется условной компиляцией.
Теперь если запустить деление, то возникнет ошибка:
В области отладчика, если развернуть self можно видеть значение членов AppDelegate.
Бываю также случаи, когда окно отладчика не появляется автоматически:
- неверное значение параметра в сообщении;
- отправка сообщения объекту, который не знает как обрабатывать это сообщение.
Пример.
Определим директиву:
#import "BTSAppDelegate.h"
#define D_SHOW_DIVIDEBYZERO_BUG 0
#define D_SHOW_INDEXOUTOFRANGE_BUG 1
Изменим код BTSAppDelegate.m следующим образом:
/*
Create the App implementation for the buttons
*/
- (IBAction)myButtonAction:(id)a_sender;
{
// Use an array to hold the valid operations
NSArray *l_validOperations = [NSArray arrayWithObjects: @"+",
@"-",
@"x",
@"÷",
nil];
// For now, just beep
// Comment out the beep, we don't need it
// NSBeep();
// Get the button title (+, -, x, or ÷) to
// determine which operation the App will
// preform
NSString *l_operation = [a_sender title];
#if D_SHOW_DIVIDEBYZERO_BUG
int l_value1 = [mValue1 doubleValue];
int l_value2 = [mValue2 doubleValue];
#else
// Get a double precision number from the
// first text field
double l_value1 = [mValue1 doubleValue];
// Get a double precision number from the
// second text field
double l_value2 = [mValue2 doubleValue];
// Create a double precision variable to
// hold the result of l_value1 <op> l_value2
#endif
double l_result;
// If the operation was addition, then
// add the two values
if ([[l_validOperations objectAtIndex:0]
isEqual: l_operation])
{
l_result = l_value1 + l_value2;
}
// If the operation was subtraction, then
// subtract the two values
else if ([[l_validOperations objectAtIndex:1]
isEqual: l_operation])
{
l_result = l_value1 - l_value2;
}
// If the operation was multiplication, then
// multiply the two values
#if D_SHOW_INDEXOUTOFRANGE_BUG
else if ([[l_validOperations objectAtIndex:22]
isEqual: l_operation])
#else
else if ([[l_validOperations objectAtIndex:2]
isEqual: l_operation])
#endif
{
l_result = l_value1 * l_value2;
}
// The operation must have been division, so
// divide the first value by the second value
else
{
l_result = l_value1 / l_value2;
}
// Set the result text field to the result
[mResult setDoubleValue:l_result];
}
Перед запуском программы лучше делать Product -> Clean, чтобы удалить старые версии.
При запуске этого примера окно отладчика не появится автоматически. Чтобы появилось нужно сделать следующее: