Является ли действительный государственный домен программы обычным языком? - PullRequest
0 голосов
/ 10 апреля 2010

Если вы посмотрите на стек вызовов программы и рассматриваете каждый указатель возврата как токен, , какие типы автоматов необходимы для создания распознавателя для действительных состояний программы?

Как следствие, какие автоматы нужны для создания распознавателя для определенного состояния ошибки?

(Примечание: я смотрю только информацию, которую можно получить из этой функции .)


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


Примечание: я не предлагаю это как диагностический инструмент, а как инструмент управления данными для превращения кучи отчетов о сбоях в нечто более полезное.

  • «Эти 54 катастрофы кажутся связанными, как и те 42.»
  • «Эти новые сбои кажутся не связанными ни с чем до даты X».
  • и т.д.

Казалось бы, мне не совсем ясно, что я думаю о достижении, поэтому вот пример:

Скажем, у вас есть программа, в которой есть три ошибки.

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

Кроме того, когда программа дает сбой (сбой утверждения, неперехваченное исключение, seg-V, переполнение стека и т. Д.), Она захватывает трассировку стека, извлекает на ней сайты вызовов и отправляет их на сервер отчетов QA. (Я предполагаю, что извлекается только эта информация, потому что 1 легко получить с разовой стоимостью проекта, а 2 - с простым определенным значением, которое можно использовать без каких-либо специальных знаний о программе)

То, что я предлагаю, - это инструмент, который будет пытаться классифицировать входящие отчеты как связанные с одной из известных ошибок (или как новую ошибку).

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

Ответы [ 2 ]

0 голосов
/ 10 апреля 2010

Указатель возврата в стеке - это просто указатель на память. Теоретически, если вы посмотрите на стек вызовов программы, которая выполняет только один вызов функции, указатель возврата (для этой одной функции) может иметь различное значение для каждого выполнения программы. Как бы вы проанализировали это?

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

0 голосов
/ 10 апреля 2010

Если ваша программа украшена операторами assert, то каждый оператор assert определяет допустимое состояние. Программные операторы между утверждениями определяют действительные изменения состояния.

Программа, которая аварийно завершает работу, нарушила достаточно утверждений о том, что что-то сломалось.

Программа, которая неверна, но "ненадежна", нарушила хотя бы одно утверждение, но не провалилась.

Не совсем понятно, что вы ищете. Допустимые состояния - иногда - трудно определить, но - обычно - легко представить в виде простых assert утверждений.

Поскольку сбойная программа нарушила одно или несколько утверждений, программе с явными исполняемыми утверждениями не требуется отладка при сбое. Это просто провалит утверждение утверждения и заметно умрет.

Если вы не хотите помещать утверждения assert, тогда по существу невозможно узнать, какое состояние должно быть истинным и какое (никогда не заявленное) утверждение было нарушено.

Разматывание стека вызовов для определения положения, и вложение является тривиальным. Но не ясно, что это показывает. Он говорит вам, что сломалось, но не то, что другие вещи ведут к поломке. Это потребовало бы угадать, какие утверждения, где предполагалось, были правдой, что требует глубокого знания дизайна.


Edit.

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

Если вы не знаете, что должно быть верным, все, что у вас есть, - это случайная лужа переменных. Что вы можете утверждать о «связанных», учитывая случайную кучу значений?

Crash 1: a = 2, b = 3, c = 4 

Crash 2: a = 3, b = 4, c = 5 

Относящиеся? Unrelated? Как вы можете классифицировать их, не зная всего о коде? Если вы знаете все о коде, вы можете сформулировать стандартные условия assert утверждения, что должно быть true. И тогда вы знаете, что такое настоящий сбой.

...