[Перевод] «Продуйте пыль с разъёма»: хитрости техподдержки

bs0hmcsgw_y5wrqa7m2lvjjn9ei.jpeg

Продуйте пыль с разъёма


Я раскрою вам один из трюков отдела поддержки продукта. Иногда вы общаетесь по телефону или в чате с кем-то, и подозреваете, что проблема может быть лишь в том, что он забыл подключить кабель или засунул его не в тот порт. Раньше такое легко могло произойти с разъёмами PS/2, подходящими и к клавиатуре, и к мыши, а сейчас — с сетевыми кабелями, которые подходят и к upstream-, и к downstream-портам маршрутизатора.

Трюк вот в чём: не спрашивайте «Вы уверены, что подключили всё правильно?» Если вы сделаете это, то собеседник оскорбится и возмущённо бросит: «Разумеется! Я что, похож на идиота?», ничего при этом не проверив.

Вместо этого скажите: «Иногда разъём запыляется и соединение ослабевает. Можете отключить разъём, выдуть из него пыль и снова подключить его?»

Собеседник заберётся под стол, обнаружит, что забыл подключить кабель (или подключил его не в тот разъём), выдует пыль, подключит его правильно и ответит вам: «Э-э-э, да, в этом и была проблема, спасибо».

(Или если проблема заключалась в кабеле, подключенном к не тому порту, то отключив его и подув на разъём, клиент отводит глаза от порта. И когда ему надо снова вставить разъём, он будет смотреть внимательно и теперь подключит его правильно.)

Клиент сохранит лицо, вы закроете тикет, и все счастливы.

Аналогично, не спрашивайте «Вы уверены, что устройство включено?», а попросите клиента отключить и снова включить его.

Мы не понимаем, как отладить проблему, можете нам помочь?


Иногда при изучении проблемы выясняется, что она возникает при вызове пропатченной или перехватываемой функции1. (В случае корпоративных клиентов причиной часто становится какое-нибудь «прогрессивное антивирусное ПО», за которое они заплатили деньги.)

Работающий в хуке код выполняет что-то подозрительное, например, перехват низкоуровневой функции с последующим вызовом со стороны хука высокоуровневой функции, что приводит к блокировке. Забавный пример: перехват Heap­Alloc (низкоуровневой функции распределения памяти) и вызов Message­Box (высокоуровневой функции пользовательского интерфейса).

Ещё один пример: перехват функции таким образом, что он меняет неуточнённое, но наблюдаемое состояние, например, изменяет значение, возвращённое Get­Last­Error при успешном завершении функции.

Трюк здесь заключается в том, чтобы не говорить клиенту «Мы думаем, что проблему вызывает ваше антивирусное ПО». Этого он услышать не хочет. В конце концов, он заплатил кучу денег за это антивирусное ПО, и рекомендация «выбросите кучу денег, которую вы уже потратили», ему сильно не понравится. (См. также «ловушка невозвратных трат».)

Вместо этого скажите клиенту «Похоже, антивирусное ПО препятствует нам в отладке проблемы. Можете временно отключить его, воспроизвести проблему по тем же инструкциям, с теми же этапами сбора трассировки и аварийного дампа? Сделав это, вы можете снова включить антивирусное ПО».

Иными словами, мы говорим: «Проблема не в вас, а в нас. Мы пытаемся отладить проблему в нашем ПО, и мы полностью признаём, что это проблема в нашем ПО, но нам не хватает ума сделать это, пока работает другое ПО. Можете нам помочь и убрать препятствия?»

Мне говорили, что обычно2 в таком случае клиент по какой-то загадочной причине не может воспроизвести проблему при отключенном антивирусном ПО. «Хм, как странно».

Иногда клиент понимает намёк и открывает тикет у поставщика антивируса. Иногда нам приходится намекнуть: «Почему бы не проверить, нет ли обновлений для вашего антивирусного ПО?»

1. Часто встречающийся пример этого — вызов Tls­Get­Value из хука, что имеет задокументированный побочный эффект в виде сброса последнего кода ошибки.

2. Обычно, но не всегда. Иногда оказывается, что антивирусное ПО не является источником проблемы. Но мы не обманываем! Убрав из уравнения антивирусное ПО, мы упрощаем отладку: так как у нас нет символов для антивирусного ПО, трассировки стеков оказываются замусорены загадочными кадрами, и иногда кадры настолько запутаны, что отладчик не может найти концов. Устранение антивирусного ПО приводит к созданию более чистых и полных стековых кадров, что сильно упрощает анализ.

© Habrahabr.ru