Как отладить программу без отладчика? [закрытый]

RPC/кодировать является остатком до объектов SOAP, были определены с XML-схемой. Это не широко поддерживается больше. Необходимо будет генерировать тупики с помощью Ось Apache 1.0 , который является с той же эры.

java org.apache.axis.wsdl.WSDL2Java http://someurl?WSDL 

Вам будут нужны следующие банки или эквиваленты в - параметрический усилитель пути к классу CP:

Это генерирует подобные тупики к wsimport.

, Кроме того , если Вы не используете части схемы, которые требуют rpc/encoded, можно загрузить копию WSDL и прокомментировать те биты. Тогда выполненный wsimport против локального файла.

при рассмотрении WSDL следующие биты используют rpc/encoded:


13
задан Pale Blue Dot 18 July 2013 в 19:49
поделиться

15 ответов

На самом деле у вас довольно много возможностей. Либо с перекомпиляцией исходного кода, либо без.

С перекомпиляцией.

  • Дополнительное ведение журнала . Либо в журналы программы, либо с помощью системного журнала (например, OutputDebugString или журнала событий в Windows). Также используйте следующие шаги:
    • Всегда включайте временную метку с разрешением не менее секунд.
    • Рассмотрите возможность добавления идентификатора потока в случае многопоточных приложений.
    • Добавьте хороший вывод ваших структур
    • Не распечатывайте перечисления только с% d. Используйте ToString () или создайте какую-нибудь функцию EnumToString () (в зависимости от вашего языка)
    • ... и будьте осторожны: регистрация изменений таймингов в случае многопоточности ваши проблемы могут исчезнуть.
    • Подробнее об этом здесь .
  • Введите дополнительные утверждения
  • Модульные тесты
  • «Аудиовизуальный» мониторинг: если что-то случается сделать один из
    • использовать зуммер
    • воспроизводить системный звук
    • мигать светодиодами, активируя аппаратную линию GPIO (только во встроенных сценариях)

Без перекомпиляции

  • Если ваше приложение использует сеть любого типа: Packet Sniffer или я просто выберу для вас: Wireshark
  • Если вы используете базу данных: отслеживайте отправку запросов к базе данных и самой базе данных.
  • Используйте виртуальные машины для тестирования точно такой же конфигурации ОС / оборудования, что и ваша система работает на.
  • Используйте какой-нибудь монитор системных вызовов. Это включает в себя
    • В системе Unix strace или dtrace
    • В инструментах Windows из бывших инструментов Sysinternals , таких как http://technet.microsoft.com/en- us / sysinternals / bb896645.aspx , ProcessExplorer и подобные
    • В случае графического интерфейса Windows: ознакомьтесь с Spy ++ или для WPF Snoop ( хотя второй я не использовал)
    • Рассмотрите возможность использования некоторых инструментов профилирования для вашей платформы. Это даст вам обзор того, что происходит в вашем приложении.
  • [Настоящая хардкор] Мониторинг оборудования: используйте осциллограф (также известный как O-Scope) для мониторинга сигналов на линиях оборудования
  • Отладка исходного кода: вы садитесь за свой исходный код и просто притворяетесь частью бумага и карандаш, что вы компьютер. Это так называемый анализ кода или отладка «на моих глазах»
  • Отладка системы управления версиями. Сравните различия вашего кода с момента, когда он «работает», и сейчас. Ошибка может быть где-то там.

И несколько общих советов в конце:

  • Не забывайте о Текст в столбцы и Сводная таблица в Excel. Вместе с некоторыми текстовыми инструментами ( awk , grep или perl ) вы получите невероятный пакет анализа. Если у вас более 32 КБ записей, рассмотрите возможность использования Access в качестве источника данных.
  • Основы хранилища данных могут помочь. С помощью простого куба вы можете анализировать тонны временных данных всего за несколько минут.
  • Стоит упомянуть сброс вашего приложения. Либо в результате сбоя, либо просто на регулярной основе
  • Всегда генерируют символы отладки (даже для сборок выпуска ).
  • Почти последнее, но не менее важное: на большинстве мэрских платформ есть какие-то всегда встроен отладчик командной строки (даже Windows!). С помощью некоторых приемов, таких как условная отладка и break-print-continue, вы можете получить довольно хороший результат с неясными ошибками
  • И последнее, но не менее важное: используйте свой мозг и подвергайте сомнению все .

В целом отладка как наука: вы не создаете ее, вы ее открываете. Часто это все равно что искать убийцу по уголовному делу.

54
ответ дан 1 December 2019 в 17:11
поделиться

Всего пара предложений:

1) Утверждения. Это должно помочь вам выработать общие ожидания на разных этапах программы. Также ознакомьтесь с кодом

2) Модульные тесты. Я использовал их время от времени, чтобы копаться в новом коде и тестировать API

5
ответ дан 1 December 2019 в 17:11
поделиться

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

Кандидат: Значит, вы не покупаете отладчики для своих разработчиков?
Опрашивающий: Нет, у них есть отладчики.

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

Кандидат: Я бы добавил операторы протоколирования или печати. Могу я задать вам аналогичный вопрос?
Интервьюер: Конечно.

Кандидат: Как бы вы набрали команду разработчиков, если бы вы этого не сделали?

3
ответ дан 1 December 2019 в 17:11
поделиться

Одно слово: ведение журнала.

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

Java: log4j

.Net: NLog или log4net

Python: Python Logging

PHP: Pear Logging Framework

Ruby: Ruby Logger

C: log4c

4
ответ дан 1 December 2019 в 17:11
поделиться

Экспертная проверка. Вы смотрите на код 8 часов, и ваш мозг просто показывает вам то, что вы хотите видеть в коде. Свежая пара взглядов может иметь решающее значение.

Контроль версий. Специально для больших команд. Если кто-то изменил что-то, на что вы полагаетесь, но не сказал вам, легко найти конкретный набор изменений, который вызвал ваши проблемы, откатывая изменения один за другим.

3
ответ дан 1 December 2019 в 17:11
поделиться

Двоичный поиск по времени также является методом: если у вас есть исходный код, хранящийся в репозитории управления версиями, и вы знаете, что версия 100 работает, а версия 200 - нет, попробуйте посмотрим, работает ли версия 150. Если это так, ошибка должна быть между версией 150 и 200, поэтому найдите версию 175 и посмотрите, работает ли она ... и т. Д.

2
ответ дан 1 December 2019 в 17:11
поделиться

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

3
ответ дан 1 December 2019 в 17:11
поделиться

В системах * nix strace и / или dtrace могут очень много рассказать о выполнении вашей программы и используемых библиотеках.

2
ответ дан 1 December 2019 в 17:11
поделиться
  • используйте println / log in код
  • использовать проводник БД для просмотра данных в DB / файлах
  • писать тесты и помещать утверждения в подозрительные места
1
ответ дан 1 December 2019 в 17:11
поделиться

В более общем плане вы можете отслеживать побочные эффекты и вывод программы, а также запускать определенные события в программе извне.

Оператор Print не всегда подходит. Вы можете использовать другие формы вывода, такие как запись в журнал событий или файл журнала, запись в сокет TCP (у меня есть хорошая утилита, которая может прослушивать этот тип трассировки из моей программы) и т. Д.

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

Существование другого файла может вызвать запись внутреннего состояния программы в ваш механизм регистрации.

1
ответ дан 1 December 2019 в 17:11
поделиться

Spy ++ (а в последнее время Snoop для WPF) очень полезны для понимания ошибок пользовательского интерфейса Windows.

1
ответ дан 1 December 2019 в 17:11
поделиться

как и все остальные сказали:

  • Журнал
  • Утверждает
  • Дополнительный вывод

и

ваш любимый диспетчер задач или процесс Explorer

связывает здесь и здесь

1
ответ дан 1 December 2019 в 17:11
поделиться

Еще одна вещь, о которой я здесь не упоминал и которую мне пришлось довольно часто использовать во встроенных системах, - это последовательные терминалы.

Вы не можете использовать последовательный терминал практически для любого типа устройства. на планете (я даже сделал это для встроенных процессоров для гидравлики, генераторов и т. д.). Затем вы можете записать в последовательный порт и увидеть все на терминале.

Вы можете получить настоящую фантазию и даже настроить поток, который слушает последовательный терминал и отвечает на команды. Я также сделал это и реализовал простые команды для создания дампа списка, просмотра внутренних переменных и т. Д., И все это через простой последовательный порт RS-232 со скоростью 9600 бод!

1
ответ дан 1 December 2019 в 17:11
поделиться

First of all, what does debugging actually do? Advanced debuggers give you machine hooks to suspend execution, examine variables and potentially modify state of a running program. Most programs don't need all that to debug them. There are many approaches:

  1. Tracing: implement some kind of logging mechanism, or use an existing one such as dtrace(). It usually worth it to implement some kind of printf-like function that can output generally formatted output into a system log. Then just throw state from key points in your program to this log. Believe it or not, in complex programs, this can be more useful than raw debugging with a real debugger. Logs help you know how you got into trouble, while a debugger that traps on a crash assumes you can reverse engineer how you got there from whatever state you are already in. For applications that you use other complex libraries that you don't own that crash in the middle of them, logs are often far more useful. But it requires a certain amount of discipline in writing your log messages.

  2. Program/Library self-awareness: To solve very specific crash events, I often have implemented wrappers on system libraries such as malloc/free/realloc which extensions that can do things like walk memory, detect double frees, attempts to free non-allocated pointers, check for obvious buffer over-runs etc. Often you can do this sort of thing for your important internal data types as well -- typically you can make self-integrity checks for things like linked lists (they can't loop, and they can't point into la-la land.) Even for things like OS synchronization objects, often you only need to know which thread, or what file and line number (capturable by __FILE__, __LINE__) the last user of the synch object was to help you work out a race condition.

  3. If you are insane like me, you could, in fact, implement your own mini-debugger inside of your own program. This is really only an option in a self-reflective programming language, or in languages like C with certain OS-hooks. When compiling C/C++ in Windows/DOS you can implement a "crash-hook" callback which is executed when any program fault is triggered. When you compile your program you can build a .map file to figure out what the relative addresses of all your public functions (so you can work out the loader initial offset by subtracting the address of main() from the address given in your .map file). So when a crash happens (even pressing ^C during a run, for example, so you can find your infinite loops) you can take the stack pointer and scan it for offsets within return addresses. You can usually look at your registers, and implement a simple console to let you examine all this. And voila, you have half of a real debugger implemented. Keep this going and you can reproduce the VxWorks' console debugging mechanism.

  4. Another approach, is logical deduction. This is related to #1. Basically any crash or anomalous behavior in a program occurs when it stops behaving as expected. You need to have some feed back method of knowing when the program is behaving normally then abnormally. Your goal then is to find the exact conditions upon which your program goes from behaving correctly to incorrectly. With printf()/logs, or other feedback (such as enabling a device in an embedded system -- the PC has a speaker, but some motherboards also have a digital display for BIOS stage reporting; embedded systems will often have a COM port that you can use) you can deduce at least binary states of good and bad behavior with respect to the run state of your program through the instrumentation of your program.

  5. A related method is logical deduction with respect to code versions. Often a program was working perfectly at one state, but some later version is not longer working. If you use good source control, and you enforce a "top of tree must always be working" philosophy amongst your programming team, then you can use a binary search to find the exact version of the code at which the failure occurs. You can use diffs then to deduce what code change exposes the error. If the diff is too large, then you have the task of trying to redo that code change in smaller steps where you can apply binary searching more effectively.

6
ответ дан 1 December 2019 в 17:11
поделиться

Было бы неплохо прочитать Delta Debugging от Андреаса Зеллера. Это похоже на двоичный поиск для отладки

1
ответ дан 1 December 2019 в 17:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: