Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
9.23 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

220m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 9. Поиск ошибокClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

когда код, управляемый событиями, ждет событие, которое нико% гда не может произойти. Однако обычно несложно прервать выпол% няемую программу, посмотреть, где застрял код, и определить при% чину зависания.

В различных ОС, языках и окружениях есть свои способы сообщения о таких ошибках, использующие разную терминологию. В некоторых языках исключаются целые классы ошибок из%за отсутствия средств, которыми пользователь может себе навредить. Например, в Java нет указателей и проверка каждого обращения к памяти осуществляется автоматически.

Борьба с вредителями

Выдергивать сорняки из программ трудно. Нужно обнаружить ошиб% ку, распознать проблему, искоренить все следы нежелательного пове% дения, проверить, не проникла ли ошибка в другие места, и постарать% ся не испортить ничего в коде, проводя все эти действия. Даже первый шаг – обнаружение ошибки – представляет собой большое затрудне% ние: человек совершает ошибки при письме, но не меньшее их количе% ство он делает при чтении. Читая свой текст или код, я, естественно, вижу то, что хотел написать, а не то, что написал в действительно# сти. Ошибки в коде не бросаются в глаза. От компилятора помощи то% же немного; он действует весьма педантично. Компилятор сделает в точности то, о чем вы просили, а не то, что вы подразумевали.

Есть программисты, которые по сравнению со своими коллегами значи% тельно реже (на 60%) допускают ошибки в коде, быстрее отыскивают и исправляют ошибки (тратя 35% обычного времени), а при исправле% нии вносят меньше новых ошибок (Gould 75). Как им это удается? Они обладают естественной способностью более внимательно относиться к решаемой задаче и концентрироваться на микроскопическом уровне кода, который пишут, в то же время не упуская из виду общую картину.

Таково искусство отладки; в значительной мере это мастерство, кото% рое нужно освоить. Умение эффективной отладки приходит с опытом. И такого опыта у каждого будет предостаточно.

Самое главное правило отладки: думай головой. Контролируй, чем ты занят. Не крутись без толку, меняя куски кода в надежде, что все вдруг заработает.

Следуйте золотому правилу отладки: думать головой.

Есть два пути истребления вредителей: обходная дорога на скорую руку и теоретически правильная столбовая дорога. Знать нужно оба пути: иногда обходная дорога кажется быстрым способом решить проблему, а в действительности отнимает больше времени, а иногда следование по главной дороге отнимает больше сил, чем требуется на самом деле.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

Борьбаm

с вредителями

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

Обходная дорога

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

221Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Ошибка очень проста. Причина очевидна. Стоит ли долго размыш% лять? Иногда для успеха достаточно небольшой правки; несколько простых тестов быстро находят проблему. Так стоит ли городить ого% род? Возможно, что и нет, но не надейтесь, что вам всегда будет так везти. Очень часто программисты пытаются исправлять ошибки мел% кими поправками, заплатками, нашлепками, не особенно задумыва% ясь над смыслом своих действий. В результате польза бывает сомни% тельной: они просто скрывают исходную проблему с помощью тьмы других ошибок.

Если вы приняли решение починить код на скорую руку, установите для себя жесткие временные границы. Не тратьте полдня на то, чтобы «попробовать еще один способ». После того как отведенное время вы% шло, переходите к методическому подходу, описываемому ниже.

Установите разумное временное ограничение на «бессистемную» отладку, и если она окажется безуспешной, переходите на более методичный способ.

Если ваши гадания будут удачны и вы найдете ошибку, снова вклю% чайте в работу мозги. Читайте «Как исправлять ошибки» на стр. 228 и изменяйте код осторожно и продуманно. Даже если ошибку удалось легко найти, ее исправление может оказаться не столь очевидным.

Правильный путь

Для отладки лучше применять более методичную и продуманную тех% нологию, которая учитывает, что задача устранения неисправности имеет две разные стороны: поиск ошибки и ее исправление.

Каждая из сторон имеет свои трудности. Часто забывают о второй час% ти и считают, что раз ошибка найдена, то исправление ее окажется очевидным. Это не так. Ниже я подробно расскажу об обоих аспектах и очерчу разумный подход к решению задачи. Но сначала о некоторых главных принципах, которым подчиняются действия при отладке:

Трудность обнаружения ошибки зависит от того, хорошо ли вам знаком код, в котором она притаилась. Трудно залезть в код, кото% рый вы видите впервые, и принимать какие%то решения, не зная его структуры и принципов работы. Поэтому если вы вынуждены отлаживать незнакомый код, потратьте сначала некоторое время на его изучение.

Изучите отлаживаемый код – трудно найти ошибки в коде, который вам не& понятен.

Насколько легко проводить отладку, зависит также от степени ваше% го контроля над средой выполнения – в каком объеме вам доступны

действия с программой и изучение ее состояния. Для встроенного