Qt программа завершилась с ошибкой

Студворк — интернет-сервис помощи студентам

Привет всем!
Интересно, что это за байда ?
Кодим. С ошибкой. Естественно получаем «qt программа неожиданно завершилась «
Удаляем ошибку — qt программа неожиданно завершилась
Коментим всё, фактически возвращаясь к пустому проекту, по дефолту — qt программа неожиданно завершилась
Пересборка всего — qt программа неожиданно завершилась

Режим debug без ошибки в коде — ок.
Режим release без ошибки в коде — qt программа неожиданно завершилась

Новый проект, переносим в него код без ошибки — ок
2.-й запуск без иземенений — ок
3. делаем умышленно ошибку — qt программа неожиданно завершилась
4. удаляем ошибку — qt программа неожиданно завершилась
5.Пересобираем -qt программа неожиданно завершилась

Удаляем папки debug/release , пересобираем — ок
Делаем ошибки — qt программа неожиданно завершилась , это норм
Удалаяем ошибки.
Удаляемм папки debug/releaase, пересобираем — ок.

Т.е. если я даже исправил все ошибки, и пересобрал — qt программа неожиданно завершилась
Если я перед пересборкой удалил папки debug/release — ок

Что это может быть ?

Создавал игру, вышла ошибка. Код ошибки :
The program has unexpectedly finished.
The process was ended forcefully.
build-SpaceRangers-Desktop_Qt_5_15_1_MSVC2015_64bit-DebugdebugSpaceRangers.exe crashed.

Код игры :

View.h

#pragma once

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QObject>

#include "player.h"
#include "virus.h"
#include "laserbullet.h"

class View :public QGraphicsView
{
public:
    View();
    void view_elements();
    QList<QGraphicsItem*> Viruses;
    void viruspodMoving(QGraphicsItem *virus);
    void deleteVirus(QGraphicsItem *virus);

public slots:
    void addVirus();
    void virusMov();
    void PlayerAttack();

private:
    QGraphicsScene mainScene;
    Player pl;
    Virus vir;
    LaserBullet lb;
    View *v;
    QTimer     *timer; // Таймер
    QTimer *createVirus;
    QTimer *vm;
    Virus *vc;
};

View.cpp

#include "view.h"
#include "player.h"

#include <QObject>
#include <QTimer>
#include <QtGlobal>

View::View()
{

    setWindowTitle("Space Rangers");

    setRenderHint(QPainter::Antialiasing);

    setFrameStyle(0);
    setSceneRect(0, 0, 600,700);
    setFixedSize(600, 700);


    mainScene.setItemIndexMethod(QGraphicsScene::NoIndex);
    setScene(&mainScene);

    connect(&pl, &Player::IS_IT_Attack, this, &View::PlayerAttack);

    timer = new QTimer(this);
    connect(timer, &QTimer::timeout, &pl, &Player::actions);
    timer->start(1000 / 50);
    view_elements();

    vm = new QTimer(this);
    connect(vm, &QTimer::timeout, this, &View::virusMov);

    createVirus = new QTimer(this);
    connect(createVirus, &QTimer::timeout, this, &View::addVirus);
    createVirus->start(30000);

}

void View::view_elements(){

    pl.setPos(205, 400);
    mainScene.addItem(&pl);
}

void View::addVirus(){

    Virus *virus = new Virus();
    vc = virus;
    mainScene.addItem(virus);
    virus->x = ((int)rand()/(420));
    virus->setPos(vir.x, 0);
    Viruses.append(virus);
    viruspodMoving(virus);

}

void View::deleteVirus(QGraphicsItem *virus){

    foreach(QGraphicsItem *v, Viruses){
        if(v == virus){
            mainScene.removeItem(v);
            Viruses.removeOne(v);
            delete vc;
            vir.y = 0;
        }
    }

    createVirus->start(30000);
}

void View::viruspodMoving(QGraphicsItem *virus){

    if(vir.y < 671){
        emit vm->start(100);
    }

    if(vir.y >= 670){
        deleteVirus(virus);
    }

}

void View::virusMov(){

    if(vir.y < 671){
        vir.y = vir.y + 4;
        vc->setPos(vir.x, vir.y);
        viruspodMoving(vc);
       
  }

}

void View::PlayerAttack(){

    LaserBullet *bullet = new LaserBullet();
    LaserBullet *bullet2 = new LaserBullet();
    lb.x = pl.x + 41;
    lb.y = pl.y - 32;
    lb.x2 = pl.x + 25;
    lb.y2 = pl.y - 32;
    bullet->setPos(lb.x, lb.y);
    mainScene.addItem(bullet);
    bullet2->setPos(lb.x2, lb.y2);
    mainScene.addItem(bullet2);
}

Virus.h

#pragma once

#include <QtWidgets>
#include <QGraphicsItem>

class Virus: public QObject, public QGraphicsItem
{
    Q_OBJECT

public:
    Virus(QObject *parent = 0);
    ~Virus();
    int vWidth = 70;
    int vHeigth = 55;
    int x = 0;
    int y = 0;


signals:
    void checkVirus(QGraphicsItem *item);


private:
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget) override;
    QRectF boundingRect() const override;
    QPixmap *VirusImage;

};

Virus.cpp

+
#include "virus.h"
#include "view.h"

Virus::Virus(QObject *parent):QObject(parent), QGraphicsItem()
{
    VirusImage = new QPixmap();
    VirusImage->load(":/Virus.png");
}

Virus::~Virus(){

}

QRectF Virus::boundingRect() const{

    return QRectF(0, 0, vWidth, vHeigth);
}

void Virus::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget){

    painter->drawPixmap(0, 0, vWidth, vHeigth, *VirusImage);
    Q_UNUSED(option);
    Q_UNUSED(widget);

}

Автор Тема: Qt: Вылетает программа при закрытии главного окна  (Прочитано 8975 раз)
FluffyMan2000

Гость


Доброго времени суток.

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

Имеется QMainWindow с QMdiArea в качестве centralWodget. В QMdiArea создаются окна (объекты, наследники QTextEdit со своими слотами «сохранить», «сохранить как»). Реализовал вызов диалогового окна при закрытии документа и при закрытии главного окна что-то вроде «документ не сохранен. сохранить?».

Проблема в следующем:
1)если создаю несколько окон, и закрываю один за одним, то вылетает программа при закрытии последнего дочернего окна. То есть если создам одно окно и его закрою — вылетает с ошибкой в консоль «программа неожиданно завершилась»
2) если закрываю главное окно и в нем имеются дочерние — тоже вылетает с ошибкой той же самой.

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


Записан
V1KT0P

Гость


Как минимум у тебя в функции:

C++ (Qt)

void MainWindow::checkForActionsAvailable()

нету проверки:

C++ (Qt)

ui->mdiArea->isActiveWindow()

Также при каждом касте qobject_cast надо проверять не возвращает ли он ноль.
Как по мне так у тебя проблемы с архитектурой из-за плохого понимания Qt.


Записан
FluffyMan2000

Гость


Также при каждом касте qobject_cast надо проверять не возвращает ли он ноль.
Как по мне так у тебя проблемы с архитектурой из-за плохого понимания Qt.

в чем непонимание? это (использование кастов) вообще в примерах Макса Шлее написано.


Записан
V1KT0P

Гость


в чем непонимание? это (использование кастов) вообще в примерах Макса Шлее написано.

qobject_cast это тебе не static_cast и может спокойно вернуть ноль и вот тут начнется веселье. Особенно если программа большая, а ошибка достаточно редкая.


Записан
FluffyMan2000

Гость


понял.

устроил проверку на ноль при сохранении в слотах delegateForSave и delegateForSaveAs — возвращает не ноль. но ошибка та же.

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


Записан
Mikhail


Ты используешь QMdiArea и не прочитав описания класса подсовываешь ему не наследников QMdiSubWindow, а какую то «дрянь» наследников QTextEdit.

Из документации:
Subwindows in QMdiArea are instances of QMdiSubWindow. They are added to an MDI area with addSubWindow(). It is common to pass a QWidget, which is set as the internal widget, to this function, but it is also possible to pass a QMdiSubWindow directly.The class inherits QWidget, and you can use the same API as with a normal top-level window when programming. QMdiSubWindow also has behavior that is specific to MDI windows. See the QMdiSubWindow class description for more details.


Записан
V1KT0P

Гость


понял.
устроил проверку на ноль при сохранении в слотах delegateForSave и delegateForSaveAs — возвращает не ноль. но ошибка та же.
еще заметил, что если создать два документа и нажать в тулбаре сохранить, то диалог сохранения вылезет два раза.

Я же тебе уже указал на эту ошибку. Вот исправь для начала функцию «void MainWindow::checkForActionsAvailable()» на вот это, а затем уже выясняй что ты делаешь не так:

C++ (Qt)

void MainWindow::checkForActionsAvailable()
{
   if( !ui->mdiArea->isActiveWindow() )
   {
       qDebug() << "Error: isActiveWindow() is false";
       return;
   }
   DocWindow *widget = qobject_cast<DocWindow*>( ui->mdiArea->activeSubWindow()->widget() );
   if( !widget )
   {
       qDebug() << "Error: activeSubWindow() is not DocWindow";
       return;
   }
   ui->actionUndo->setEnabled( widget->document()->isUndoAvailable() );
   ui->actionRedo->setEnabled( widget->document()->isRedoAvailable() );
   ui->actionPaste->setEnabled( widget->canPaste() );
}

Записан
FluffyMan2000

Гость


понял.
устроил проверку на ноль при сохранении в слотах delegateForSave и delegateForSaveAs — возвращает не ноль. но ошибка та же.
еще заметил, что если создать два документа и нажать в тулбаре сохранить, то диалог сохранения вылезет два раза.

Я же тебе уже указал на эту ошибку. Вот исправь для начала функцию «void MainWindow::checkForActionsAvailable()» на вот это, а затем уже выясняй что ты делаешь не так:

C++ (Qt)

void MainWindow::checkForActionsAvailable()
{
   if( !ui->mdiArea->isActiveWindow() )
   {
       qDebug() << "Error: isActiveWindow() is false";
       return;
   }
   DocWindow *widget = qobject_cast<DocWindow*>( ui->mdiArea->activeSubWindow()->widget() );
   if( !widget )
   {
       qDebug() << "Error: activeSubWindow() is not DocWindow";
       return;
   }
   ui->actionUndo->setEnabled( widget->document()->isUndoAvailable() );
   ui->actionRedo->setEnabled( widget->document()->isRedoAvailable() );
   ui->actionPaste->setEnabled( widget->canPaste() );
}

Объясните, зачем проверять mdiArea на isActiveWindow()? и еще, программа крашится и без вызова MainWindow::checkForActionsAvailable(). так что скорее всего не в ней дело.


Записан
V1KT0P

Гость


Объясните, зачем проверять mdiArea на isActiveWindow()? и еще, программа крашится и без вызова MainWindow::checkForActionsAvailable(). так что скорее всего не в ней дело.

По крайней мере у меня под Kubuntu в процессе работы твоей программы ui->mdiArea->activeSubWindow() возвращает ноль. И вот из-за этого программа падает.


Записан
FluffyMan2000

Гость


Ты используешь QMdiArea и не прочитав описания класса подсовываешь ему не наследников QMdiSubWindow, а какую то «дрянь» наследников QTextEdit.

Из документации:
Subwindows in QMdiArea are instances of QMdiSubWindow. They are added to an MDI area with addSubWindow(). It is common to pass a QWidget, which is set as the internal widget, to this function, but it is also possible to pass a QMdiSubWindow directly.The class inherits QWidget, and you can use the same API as with a normal top-level window when programming. QMdiSubWindow also has behavior that is specific to MDI windows. See the QMdiSubWindow class description for more details.

в примерах от Макса Шлее именно так и делается


Записан
FluffyMan2000

Гость


Объясните, зачем проверять mdiArea на isActiveWindow()? и еще, программа крашится и без вызова MainWindow::checkForActionsAvailable(). так что скорее всего не в ней дело.

По крайней мере у меня под Kubuntu в процессе работы твоей программы ui->mdiArea->activeSubWindow() возвращает ноль. И вот из-за этого программа падает.

а с твоим кодом слота MainWindow::checkForActionsAvailable() не крашится при закрытии программы? и еще нюанс, у тебя Qt установлена еще нокиевская или диджитевская? потому что у меня уже был казус — программа собранная на нокиевской кьют некоректно работала на диждитевской кьют


Записан
V1KT0P

Гость


а с твоим кодом слота MainWindow::checkForActionsAvailable() не крашится при закрытии программы? и еще нюанс, у тебя Qt установлена еще нокиевская или диджитевская? потому что у меня уже был казус — программа собранная на нокиевской кьют некоректно работала на диждитевской кьют

Да, не крашится. Сборка у меня из репозитория убунты 4.8.3.
Запусти под отладчиком и посмотри бэктрейс при падении, что может быть проще?


Записан
FluffyMan2000

Гость


а с твоим кодом слота MainWindow::checkForActionsAvailable() не крашится при закрытии программы? и еще нюанс, у тебя Qt установлена еще нокиевская или диджитевская? потому что у меня уже был казус — программа собранная на нокиевской кьют некоректно работала на диждитевской кьют

Да, не крашится. Сборка у меня из репозитория убунты 4.8.3.
Запусти под отладчиком и посмотри бэктрейс при падении, что может быть проще?

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

Qt 4.7.4 (32-х битная)


Записан
FluffyMan2000

Гость


при запуске в режиме отладке в консоль вывалилось «Error: isActiveWindow() is false» и крашится все равно. спасибо за направление. буду дальше думать


Записан
FluffyMan2000

Гость


Решил таким образом:

void MainWindow::checkForActionsAvailable()
{
    if (ui->mdiArea->subWindowList().count() != 0)
    {
        DocWindow *pDoc = qobject_cast<DocWindow*>(ui->mdiArea->activeSubWindow()->widget());

        if (pDoc != 0)
        {
            ui->actionUndo->setEnabled(pDoc->document()->isUndoAvailable());
            ui->actionRedo->setEnabled(pDoc->document()->isRedoAvailable());
            ui->actionPaste->setEnabled(pDoc->canPaste());
        }
    }
}

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

« Последнее редактирование: Декабрь 09, 2012, 21:36 от FluffyMan2000 »
Записан

Просмотр 15 сообщений — с 1 по 15 (из 15 всего)

  • Автор

    Сообщения


  • sandreev86

    Участник

    Сообщений:7

    Зарегистрирован:
    07.02.2016

    Репутация:0

    Не могу запустить пример 22ого урока, компилируется нормально, но при попытке запуска сразу крашится с ошибкой “программа неожиданно завершилась” при попытке запуска отладчика вылетает ошибка “during startup program exited with code 0xc0000135″ библиотеки подключил правильно, подскажите пожалуйста в чем дело если есть догадки

    RazorNd
    RazorNd

    Участник

    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    Скинь код и проектный файл, экстрасенсорная тех. поддержка это не самая легкая задача.


    sandreev86

    Участник

    Сообщений:7

    Зарегистрирован:
    07.02.2016

    Репутация:0

    блин, так и знал что сразу надо было скинуть) компилятор MinGW 32bit

    Вложения:

    You must be logged in to view attached files.

    RazorNd
    RazorNd

    Участник

    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    Ну у меня программа падает вот в этом месте:

    Object Level::GetObject(std::string name)

    {

    // только первый объект с заданным именем

    for (int i = 0; i < objects.size(); i++)

    if (objects[i].name == name)

    return objects[i];

    }

    Причина в том, что из данного метода ничего не возвышается, если объект с таким именем не был найден. Что еще раз доказывает, что факапу быть, если игнорировать предупреждения(warning) компилятора. Я вижу два решение данной проблемы:

    • Возвращать в конце данного метода объект с вызовом конструктора по умолчанию и затем проверять результат на не равенство объекта созданного с конструктором по умолчанию. (Не рекомендую)
    • Создать класс исключения “объект не найден” и бросать его в конце данного метода.

    Если смотреть в глубь проблемы, то данного объекта нет из-за того что уровень (класс Level) не был загружен по причине отсутствия тайлсета.

    if (!img.loadFromFile(imagepath))

    {

            std::cout << «Failed to load tile sheet.» << std::endl;//если не удалось загрузить тайлсет-выводим ошибку в консоль

    return false;

    }

    Отсюда можно сделать следующие выводы:

    • либо вы не приложили папку изображений в архив и у вас совершенно другая причина не работоспособности;
    • либо вам следует проверять результат вызова метода Level::LoadFromFile и завершать работу программы с ошибкой, если уровень не был загружен.

    if(!lvl.LoadFromFile(«map.tmx»)) { //загрузили в него карту, внутри класса с помощью методов он ее обработает.

        std::cerr << «Level was not load» << std::endl;

        return 2;

    }

    P.S.: настоятельно рекомендую всем исправлять warning’и, которые возникают при компиляции.


    sandreev86

    Участник

    Сообщений:7

    Зарегистрирован:
    07.02.2016

    Репутация:0

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

    Вложения:

    You must be logged in to view attached files.

    RazorNd
    RazorNd

    Участник

    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    sandreev86, у меня для вас две новости, по традиции плохая и хорошая =)

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

    Однако у меня еще есть пара идей:

    • попробуйте собрать и запустить приложение в режиме релиза,
    • покажите переменную среды path в среде окружения запуска проекта. Для этого перейдите во вкладку “Проекты” в левом меню, в открывшемся окне выберите вкладку “Запуск” и раскройте область “Среда выполнения” там вы найдете переменные среды.


    sandreev86

    Участник

    Сообщений:7

    Зарегистрирован:
    07.02.2016

    Репутация:0

    в режиме релиза так же падает.

    А может ли влиять на это  то что система 64 битная, а среда и компилятор 32?

    Вложения:

    You must be logged in to view attached files.

    RazorNd
    RazorNd

    Участник

    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    Нет это не должно влиять. А проекты без SFML нормально работают?


    sandreev86

    Участник

    Сообщений:7

    Зарегистрирован:
    07.02.2016

    Репутация:0

    Да, нормально.

    А у тебя компилятор какой?

    RazorNd
    RazorNd

    Участник

    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    clang 3.5. А какую версию ты скачал SFML? Случайно не 64-битную?


    sandreev86

    Участник

    Сообщений:7

    Зарегистрирован:
    07.02.2016

    Репутация:0

    нет, 32


    sandreev86

    Участник

    Сообщений:7

    Зарегистрирован:
    07.02.2016

    Репутация:0

    Не знаю что я сделал, заработало) но все равно спасибо вам большое)

    RazorNd
    RazorNd

    Участник

    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

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

    Павел Букреев
    Павел Букреев

    Хранитель

    Сообщений:587

    Зарегистрирован:
    04.01.2015

    Репутация:106

    RazorNd , спасибо! очень круто отвечаешь :)


    sandreev86

    Участник

    Сообщений:7

    Зарегистрирован:
    07.02.2016

    Репутация:0

    Перекачал sfml, забыл что тот я скачивал для другого компилятора

  • Автор

    Сообщения

Просмотр 15 сообщений — с 1 по 15 (из 15 всего)

Для ответа в этой теме необходимо авторизоваться.

Здесь нам нужно использовать системный API

#include <DbgHelp.h>

Как использовать:

Добавьте следующие файлы во внешнюю программу

dbgcrash.h

#ifndef DBGCRASH_H
#define DBGCRASH_H

#include <Windows.h>
#include <DbgHelp.h>
#include <iostream>
#include <vector>
 // информация о сбое
//
using namespace std;
const int MAX_ADDRESS_LENGTH = 32;
const int MAX_NAME_LENGTH = 1024;

struct CrashInfo
{
    CHAR ErrorCode[MAX_ADDRESS_LENGTH];
    CHAR Address[MAX_ADDRESS_LENGTH];
    CHAR Flags[MAX_ADDRESS_LENGTH];
};

 // Информация CallStack
//
struct CallStackInfo
{
    CHAR ModuleName[MAX_NAME_LENGTH];
    CHAR MethodName[MAX_NAME_LENGTH];
    CHAR FileName[MAX_NAME_LENGTH];
    CHAR LineNumber[MAX_NAME_LENGTH];
};

void SafeStrCpy(char* szDest, size_t nMaxDestSize, const char* szSrc);
CrashInfo GetCrashInfo(const EXCEPTION_RECORD *pRecord);
vector<CallStackInfo> GetCallStack(const CONTEXT *pContext);
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException);
void printStack( void );

#endif // DBGCRASH_H
файл dbgcrash.cpp
#include "dbgcrash.h"

 // Функция безопасного копирования строки
//
void SafeStrCpy(char* szDest, size_t nMaxDestSize, const char* szSrc)
{
    if (nMaxDestSize <= 0) return;
    if (strlen(szSrc) < nMaxDestSize)
    {
        strcpy_s(szDest, nMaxDestSize, szSrc);
    }
    else
    {
        strncpy_s(szDest, nMaxDestSize, szSrc, nMaxDestSize);
        szDest[nMaxDestSize-1] = '';
    }
}

 // Получаем информацию о сбое программы
//
CrashInfo GetCrashInfo(const EXCEPTION_RECORD *pRecord)
{
    CrashInfo crashinfo;
    SafeStrCpy(crashinfo.Address, MAX_ADDRESS_LENGTH, "N/A");
    SafeStrCpy(crashinfo.ErrorCode, MAX_ADDRESS_LENGTH, "N/A");
    SafeStrCpy(crashinfo.Flags, MAX_ADDRESS_LENGTH, "N/A");

    sprintf_s(crashinfo.Address, "%08X", pRecord->ExceptionAddress);
    sprintf_s(crashinfo.ErrorCode, "%08X", pRecord->ExceptionCode);
    sprintf_s(crashinfo.Flags, "%08X", pRecord->ExceptionFlags);

    return crashinfo;
}

 // Получение информации CallStack
//
vector<CallStackInfo> GetCallStack(const CONTEXT *pContext)
{
    HANDLE hProcess = GetCurrentProcess();

    SymInitialize(hProcess, NULL, TRUE);

    vector<CallStackInfo> arrCallStackInfo;

    CONTEXT c = *pContext;

    STACKFRAME64 sf;
    memset(&sf, 0, sizeof(STACKFRAME64));
    DWORD dwImageType = IMAGE_FILE_MACHINE_I386;

         // Различные типы ЦП, конкретную информацию можно найти в MSDN
    //
#ifdef _M_IX86
    sf.AddrPC.Offset = c.Eip;
    sf.AddrPC.Mode = AddrModeFlat;
    sf.AddrStack.Offset = c.Esp;
    sf.AddrStack.Mode = AddrModeFlat;
    sf.AddrFrame.Offset = c.Ebp;
    sf.AddrFrame.Mode = AddrModeFlat;
#elif _M_X64
    dwImageType = IMAGE_FILE_MACHINE_AMD64;
    sf.AddrPC.Offset = c.Rip;
    sf.AddrPC.Mode = AddrModeFlat;
    sf.AddrFrame.Offset = c.Rsp;
    sf.AddrFrame.Mode = AddrModeFlat;
    sf.AddrStack.Offset = c.Rsp;
    sf.AddrStack.Mode = AddrModeFlat;
#elif _M_IA64
    dwImageType = IMAGE_FILE_MACHINE_IA64;
    sf.AddrPC.Offset = c.StIIP;
    sf.AddrPC.Mode = AddrModeFlat;
    sf.AddrFrame.Offset = c.IntSp;
    sf.AddrFrame.Mode = AddrModeFlat;
    sf.AddrBStore.Offset = c.RsBSP;
    sf.AddrBStore.Mode = AddrModeFlat;
    sf.AddrStack.Offset = c.IntSp;
    sf.AddrStack.Mode = AddrModeFlat;
#else
    #error "Platform not supported!"
#endif

    HANDLE hThread = GetCurrentThread();

    while (true)
    {
                 // Эта функция - самая важная функция для реализации этой функции
                 // Использование функции и конкретное объяснение параметров и возвращаемых значений можно найти на MSDN
        //
        if (!StackWalk64(dwImageType, hProcess, hThread, &sf, &c, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL))
        {
            break;
        }

        if (sf.AddrFrame.Offset == 0)
        {
            break;
        }

        CallStackInfo callstackinfo;
        SafeStrCpy(callstackinfo.MethodName, MAX_NAME_LENGTH, "N/A");
        SafeStrCpy(callstackinfo.FileName, MAX_NAME_LENGTH, "N/A");
        SafeStrCpy(callstackinfo.ModuleName, MAX_NAME_LENGTH, "N/A");
        SafeStrCpy(callstackinfo.LineNumber, MAX_NAME_LENGTH, "N/A");

        BYTE symbolBuffer[sizeof(IMAGEHLP_SYMBOL64) + MAX_NAME_LENGTH];
        IMAGEHLP_SYMBOL64 *pSymbol = (IMAGEHLP_SYMBOL64*)symbolBuffer;
        memset(pSymbol, 0, sizeof(IMAGEHLP_SYMBOL64) + MAX_NAME_LENGTH);

        pSymbol->SizeOfStruct = sizeof(symbolBuffer);
        pSymbol->MaxNameLength = MAX_NAME_LENGTH;

        DWORD symDisplacement = 0;

                 // получаем имя функции
        //
        if (SymGetSymFromAddr64(hProcess, sf.AddrPC.Offset, NULL, pSymbol))
        {
            SafeStrCpy(callstackinfo.MethodName, MAX_NAME_LENGTH, pSymbol->Name);
        }

        IMAGEHLP_LINE64 lineInfo;
        memset(&lineInfo, 0, sizeof(IMAGEHLP_LINE64));

        lineInfo.SizeOfStruct = sizeof(IMAGEHLP_LINE64);

        DWORD dwLineDisplacement;

                 // Получаем имя файла и строку кода
        //
        if (SymGetLineFromAddr64(hProcess, sf.AddrPC.Offset, &dwLineDisplacement, &lineInfo))
        {
            SafeStrCpy(callstackinfo.FileName, MAX_NAME_LENGTH, lineInfo.FileName);
            sprintf_s(callstackinfo.LineNumber, "%d", lineInfo.LineNumber);
        }

        IMAGEHLP_MODULE64 moduleInfo;
        memset(&moduleInfo, 0, sizeof(IMAGEHLP_MODULE64));

        moduleInfo.SizeOfStruct = sizeof(IMAGEHLP_MODULE64);

                 // получаем имя модуля
        //
        if (SymGetModuleInfo64(hProcess, sf.AddrPC.Offset, &moduleInfo))
        {
            SafeStrCpy(callstackinfo.ModuleName, MAX_NAME_LENGTH, moduleInfo.ModuleName);
        }

        arrCallStackInfo.push_back(callstackinfo);
    }

    SymCleanup(hProcess);

    return arrCallStackInfo;
}

LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
         // Убедитесь, что в стеке достаточно места
    //
#ifdef _M_IX86
    if (pException->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW)
    {
        static char TempStack[1024 * 128];
        __asm mov eax,offset TempStack[1024 * 128];
        __asm mov esp,eax;
    }
#endif

    CrashInfo crashinfo = GetCrashInfo(pException->ExceptionRecord);

         // Выводим информацию о сбое
    //
    cout << "ErrorCode: " << crashinfo.ErrorCode << endl;
    cout << "Address: " << crashinfo.Address << endl;
    cout << "Flags: " << crashinfo.Flags << endl;

    vector<CallStackInfo> arrCallStackInfo = GetCallStack(pException->ContextRecord);

         // Вывод CallStack
    //
    cout << "CallStack: " << endl;
    for (vector<CallStackInfo>::iterator i = arrCallStackInfo.begin(); i != arrCallStackInfo.end(); ++i)
    {
        CallStackInfo callstackinfo = (*i);

        cout << callstackinfo.MethodName << "() : [" << callstackinfo.ModuleName << "] (File: " << callstackinfo.FileName << " @Line " << callstackinfo.LineNumber << ")" << endl;
    }

         // Открываем диалоговое окно с ошибкой и выходим из программы
    //
    FatalAppExit(-1,  L"*** Unhandled Exception! ***");

    return EXCEPTION_EXECUTE_HANDLER;
}

void printStack( void )
{
    unsigned int   i;
    void         * stack[ 100 ];
    unsigned short frames;
    SYMBOL_INFO  * symbol;
    HANDLE         process;

    process = GetCurrentProcess();

    SymInitialize( process, NULL, TRUE );

    frames               = CaptureStackBackTrace( 0, 100, stack, NULL );
    symbol               = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
    symbol->MaxNameLen   = 255;
    symbol->SizeOfStruct = sizeof( SYMBOL_INFO );

    for( i = 0; i < frames; i++ )
    {
        SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, symbol );

        printf( "%i: %s - 0x%0Xn", frames - i - 1, symbol->Name, symbol->Address );
    }

    free( symbol );
}

Добавьте в файл .pro

CONFIG += console
CONFIG -= app_bundle
#dbghelp
LIBS += dbghelp.lib

Добавьте при входе в функцию mian:

    // Настройка обработки Unhandled Функция обратного вызова исключения
    //
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);

Будет распечатано место сбоя программы:

Возможно, вам также будет интересно:

  • Qttabbar ошибка пакета установщика windows 10
  • Qt platform plugin could be initialized ошибка как исправить
  • Qt designer ошибка генерации кода
  • Qt creator ошибки на русском
  • Qt creator ошибка при сборке

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии