Nano Hash - криптовалюты, майнинг, программирование

Сбой приложения говорит: Доступ к месту чтения нарушения

Мое приложение вылетает после работы около 18 часов. Я не могу отладить точку в коде, где он на самом деле падает. Я проверил стек вызовов - он не дает никакой информации как таковой. Последние несколько вызовов в стеке вызовов выделены серым цветом — это означает, что я не вижу код этой части — все они принадлежат библиотекам MFC.

Однако при сбое я получаю всплывающее окно «MicroSoft Visual Studio», в котором говорится:

Необработанное исключение по адресу 0x7c809e8a в NIMCAsst.exe: 0xC0000005: место чтения с нарушением прав доступа 0x154c6000.

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

10.06.2009

  • Он просто падает в какой-то случайной точке. Он входит внутрь dll MFC и там падает, а стек вызовов не говорит, какая точка в моем коде взяла на себя управление. 10.06.2009
  • Если у вас подключен отладчик, вы должны четко видеть, какая строка вашего кода вызывает MFC. Если нет, то либо включена потимизация, либо у вас есть файлы .pdb, не синхронизированные с исполняемым файлом. 10.06.2009
  • Здравствуйте, @RakeshAgarwal, я столкнулся с той же ошибкой в ​​моем проекте C++ в VS 2005. Я просто хочу знать, как вы исправили эту ошибку. Было бы очень полезно, если бы вы могли поделиться со мной своим подходом. 14.04.2020

Ответы:


1

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

10.06.2009

2

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

Моим первым предположением было бы проверить код, вызывающий код, который дал сбой, на предмет возможных проблем, которые могли его вызвать. Получаете ли вы какие-либо другие исключения или ошибки перед сбоем? Может быть, вы игнорируете возврат ошибки? Пробовали ли вы использовать кучу отладки? А как насчет adplus? Проверка приложений для включения проверки кучи?

Другие возможности включают запуск инструмента, такого как pclint, над кодом, чтобы проверить наличие очевидных проблем с использованием памяти. Вы используете треды? Возможно, есть состояние гонки. Список можно продолжать вечно.

10.06.2009
  • Ошибка может появиться, но когда произойдет сбой, это непостоянно - он падает в любое время после работы в течение 6 часов. Таким образом, я не могу следить за ошибками, возвращаемыми в течение такого длительного времени. 10.06.2009

  • 3

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

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

    Вы говорите, что видите стек вызовов, что говорит о том, что вы используете отладчик. Исходный код MFC доступен (но, возможно, не для всех редакций vc++), так что, в принципе, его можно проследить. Какую версию VС++ вы используете?

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

    Иногда «местоположение» может быть распознано как данные, и в этом случае у вас есть подсказка. Ф.э. если ошибка сказала:

    Местоположение чтения нарушения доступа 0x31323334

    вы узнаете это как часть строки ASCII «1234», и это может привести вас к виновнику.

    10.06.2009
  • Я использую Visual Studio 2005 и прикрепил приложение с решением для отладки. 10.06.2009

  • 4

    Как говорит Патрик, почти наверняка ваш код выдает недопустимые значения MFC. Можно предположить, что вы передаете неправильную длину, поэтому библиотека читает слишком далеко. Но на самом деле причин может быть множество.

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

  • 5

    Является ли сбой воспроизводимым?

    Если да, используйте лог-файлы! Вы должны использовать файл журнала и добавить числовые операторы, которые просто регистрируют переданный номер исходного файла/строки. Начните с нескольких операторов в точке входа (главный обработчик событий) и наиболее распространенных путей выполнения. После сбоя проверьте последнюю запись в файле журнала. Затем добавьте новые записи по пути/путям, которые должны были быть пройдены и т. д. Обычно после нескольких итераций этой работы вы найдете точку отказа. В случае вашего длительного ожидания файл журнала может стать огромным, и каждая итерация займет еще 18 часов. Возможно, вам придется добавить некоторую технику чередования файлов журнала и т. Д. Но с помощью этой техники я смог найти некоторые сопоставимые ошибки.

    Еще несколько вопросов:

    Является ли ваше приложение многопоточным?

    Использует ли он какие-либо массивы, не управляемые stl или сопоставимыми контейнерами (использует ли он C-Strings, C/C++-Arrays и т. д.)?

    10.06.2009
  • Да, приложение многопоточное. Нет массивов, которыми не управляет stl. Ведение журнала — хорошая идея. 10.06.2009
  • Кроме того, при добавлении в файл журнала я бы рекомендовал каждый раз открывать, записывать, сбрасывать и закрывать файл журнала, чтобы при сбое файл журнала был правильно закрыт с последним напечатанным текстом в нем. 08.08.2009

  • 6

    Попробуйте подключить к процессу отладчик и отключите отладчик при нарушении прав доступа.

    Если это невозможно, мы используем инструмент под названием «Дампер процесса пользовательского режима», чтобы создать дамп памяти процесса в точке, где произошло нарушение прав доступа. Вы можете найти это для загрузки здесь:

    http://www.microsoft.com/downloads/details.aspx?FamilyID=E089CA41-6A87-40C8-BF69-28AC08570B7E&displaylang=en

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

    Обратите внимание, что фиксируются ВСЕ нарушения прав доступа в вашем процессе — даже те, которые затем обрабатываются позже, а также полный дамп может создать некоторое время в зависимости от объема памяти, используемого приложением (10-20 секунд для процесса, потребляющего 100-100 секунд). 200 МБ личной памяти). По этой причине, вероятно, не рекомендуется включать его для всей системы.

    После этого вы сможете проанализировать дамп с помощью таких инструментов, как WinDbg (http://www.microsoft.com/whdc/devtools/debugging/default.mspx), чтобы выяснить, что произошло — в большинстве случаев вы обнаружите, что вам нужен только мини-дамп, а не полный дамп (однако, если ваше приложение не использует много памяти, то у полного дампа не так много недостатков, кроме размера дампа и времени, необходимого для создания дампа).

    Наконец, имейте в виду, что отладка нарушений прав доступа с помощью WinDbg может быть довольно трудоемким и сложным процессом — если вы можете получить трассировку стека другим способом, вы можете сначала попробовать его.

    10.06.2009

    7

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

    14.07.2015

    8

    Этот вопрос довольно старый, и у меня была такая же проблема, но я быстро ее решил - все дело в цепочках:

    Во-первых, обратите внимание, что обновление GUI можно выполнить только в основном потоке.

    Моя проблема заключалась в том, что я пытался обрабатывать графический интерфейс из рабочего потока (а не из основного потока), и у меня была та же ошибка: 0xC0000005< /сильный>. Я решил это, разместив сообщение (которое выполняется в основном потоке) - и проблема была решена:

    typedef enum {
      WM_UPDATE_GUI
    }WM_MY_MSG
    
    // register function callback to a message
    BEGIN_MESSAGE_MAP(CMyDlg, CDlgBase)
      ON_MESSAGE(WM_UPDATE_GUI, OnUpdateGui)
    END_MESSAGE_MAP()
    
    // For this example - function that is not invoked in the Main Thread:
    void CMyDlg::OnTimer() 
    { 
      CString str_to_GUI("send me to gui"); // send string to gui
      // Update_GUI(str_to_GUI); // crashed
      ::PostMessage(hWnd, MyMsg::WM_UPDATE_GUI, (WPARAM)&str_to_GUI, 0);
    }
    
    HRESULT CMyDlg::OnUpdateGui(WPARAM wParam, LPARAM lParam)
    {
      CString str = *(CString*)wParam; // get the string from the posted message
      Update_GUI(str);
      return S_OK;
    }
    
    30.11.2020
    Новые материалы

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

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

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование