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

Это ваш запрос:

SELECT A.*
FROM A LEFT JOIN
     B
     ON A.x = B.x
WHERE A.z = 'Hola' AND B.y IS NOT NULL;

Вам нужно разложить запрос.

Результирующий набор будет иметь только A.Z = 'Hola'. Это важный фильтр в предложении WHERE.

Тогда B.y IS NOT NULL означает две вещи: и то, что совпадение существует в B, и то, что y нет NULL. Итак, этот запрос эквивалентен:

SELECT A.*
FROM A INNER JOIN
     B
     ON A.x = B.x
WHERE A.z = 'Hola' AND B.y IS NOT NULL;

При внутреннем объединении вы можете поместить условия WHERE в ON. Это вопрос стиля. Вы не можете сделать это с LEFT JOIN.

Тогда «эквивалентный» EXISTS запрос будет:

SELECT A.*
FROM A 
WHERE A.z = 'Hola' AND
      EXISTS (SELECT 1 FROM B WHERE A.x = B.x AND B.y IS NOT NULL);

Это не совсем то же самое. Версия с JOIN будет возвращать повторяющиеся строки для A, если в B есть несколько совпадений. Поскольку вы выбираете только из A, дубликаты, вероятно, нежелательны, и я бы порекомендовал запрос EXISTS.

11
задан Grace Note 20 May 2010 в 20:36
поделиться

6 ответов

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

Никакая ссылка на них кроме как удовлетворенный клиент. MadExcept позволил мне разыскать и устранить некоторые очень редкие проблемы в своих программах.

10
ответ дан 3 December 2019 в 08:05
поделиться

Я повторно управлял бы некоторым рычагом Исключения, как Eurekalog или madExcept, который дает Вам хороший стек вызовов, когда исключения происходит.

Теперь это хочет, помогают Вам очень теперь, курса...

У меня не было удачи с, 'Находят ошибку' диалоговым окном. Generaly, последовательный провальный случай и большое продвижение являются единственным/самым быстрым/самым легким решением. Если это - случай неинициализированного указателя или освобожденного объекта, FastMM4 может помочь Вам с правильными настройками.

3
ответ дан 3 December 2019 в 08:05
поделиться

Когда программа отказывает, Windows должен сохранить дамп катастрофического отказа. Можно затем загрузить это в WinDbg или, в повышении, Visual Studio. Существуют различные способы проанализировать дамп для обнаружения то, что пошло не так, как надо. Запустить Вас:

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

Диагональ Отладки установки и монитор Ваше приложение, он генерирует файл ДАМПА для Вас и имеет, анализируют к.

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

Вы могли использовать Проводник Монитора или Процесса Процесса, обоих от сайта SysInternals.

0
ответ дан 3 December 2019 в 08:05
поделиться

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

  1. Посмотрите на адрес. DLL (включая ActiveX / OCX), загружаются на более высоких адрес, обычно выше 0x50000000 (DLL-библиотеки systemm обычно находятся в От 0x70000000 до 0x78000000). Похоже, ваш AV находится в DLL. Помните, что в последней версии Windows рандомизация загрузки адресного пространства может изменять адреса для каждого запуска
  2. . Стек вызовов очень важен для понимания того, как код попал в AV. Помимо EurekaLog и MadExcept, библиотеки JCL / JVCL могут использоваться для получения этой информации. Для получения полезного стека вызовов вам может потребоваться компиляция с дополнительной информацией об отладке (и файлами карт).
  3. Delphi имеет функцию отладки адреса Goto, которая позволяет загрузить приложение, приостановить его в отладчике и затем перейти к адресу. Но для этого требуется, чтобы адрес при этом не менялся (перекомпиляция с модификацией, вероятно, изменит адрес, также подойдет и рандомизация).
  4. Если ошибка не воспроизводится на вашей машине разработки, вы можете попробовать удаленный отладчик для отладки приложения, запущенного на другой машине.
0
ответ дан 3 December 2019 в 08:05
поделиться
Другие вопросы по тегам:

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