Wykrzaczanie się po kompilacji release

0

Bracia

Czego mogę użyć w przedziwnej sytuacji, kiedy program skompilowany zaraz po uruchomieniu wywala
wywrotka.PNG
do wyciągnięcia informacji co do Peruna jest nie tak?
Co dziwniejsze, nie używam niczego z VS, a co jeszcze dziwniejsze, aplikacja odpalona z Qt Creatora działa dobrze.

1

Odpal pod WinDBG i prześledź, co aplikacja dokładnie robi. Sprawdź też, jakiego runtime'u dokładnie chcesz używać i go przeinstaluj, może coś mu się wysypało (chodzi o te całe C++ Redistributable).

Sprawdź na innej maszynie, jak tam problem nie występuje, to pewnie masz jakąś binarkę zwaloną.

Zerknij na https://answers.microsoft.com/en-us/windows/forum/all/microsoft-visual-c-runtime-library-error-message/79f01db9-6bb5-424c-aca1-ab5174df0bc9?auth=1

1

Pewnie skopiowałeś CRT albo inną libkę z niewłaściwego katalogu. Użyj windeployqt i zobacz czy program nadal występuje.

0

Udało mi się wyizolować rewizję w SVN od której zaczęło się sypać, więc jakiś punkt zaczepienia jest.
@Afish
Udało się użyć "attach" do procesu przy pomocy Visual Studio, ale co dalej?
@kq
Raczej nie, bo kopiowanie mam załatwione Inno Setupem, i folderu w którym trzymam wyizolowane libki nie zmieniałem.

0

VS raczej Ci nie pomoże, chyba że przejdziesz nim po kodzie maszynowym i dokładnie sprawdzisz, co tam się dzieje. Na 95% używasz złej wersji CRT, więc możesz to debugować, ale będzie to wymagało wiedzy o bebechach pod kodem C++ (konwencje wywołania itp). Ja bym raczej szedł w upewnienie się, że na innym systemie to nie występuje i potem przeinstalowanie środowiska.

0

Ach, myślałem, że nowy program. W takim razie zobacz jaka najmniejsza zmiana powoduje takie zachowanie - zresztą wątpię abyś potrzebował tutoriala jak debugować ;​) Z doświadczenia, zobacz czy gdzieś nie masz uncaught exception albo nie jest wywoływane abort(). Dodatkowo, jeśli wszystko inne odpada - zobacz czy zreprodukujesz problem budując z -lasan, bardzo pomaga.

0

Tak apropos działania u kogoś innego - łapcie instalator Bracia @kq i @Afish:
MechDesigner v0.74 Installer.rar
Co prawda aby zadziałał w pełni to musielibyście mieć zainstalowanego Battletecha, ale jak wyświetli messageboxa z informacją, że brakuje mu ścieżki do danych, a potem OpenFileDialog do znalezienia battletech.exe to będzie oznaczało, że działa prawidłowo.
W razie jakby ktoś się bał odpalać exeka to alternatywnie może użyć jakiegoś inno script unpackera.

1

Od rana chłodek, to i mózg pracuje należycie - odpaliłem dependency walkera, a ten że brakuje IESHIMS.DLL
Poszukam tego i wrzucę do folderu instalacyjnego.

EDIT:
Niestety, to nie to.

0

Spróbuj skompilować kod z flagą -g, a resztą bez zmian (odpowiednik konfiguracji RelWithDebugInfo) i odpal pod gdb - może wtedy coś znajdziesz.

0

Dziwna sprawa.
Dałem debug info do pliku poprzez wpis w *.pro:

CONFIG += force_debug_info

Dodało się, bo plik z 1.24 MB urósł do 21 MB, mniej więcej tyle ma po kompilacji Debug.
Ok, odpalam program, oczywiście wywrotka, to używam w Qt Creatorze attach to process - A TU ZONK, przy opisie .exe jest "does not contain symbols info" o.O

1

PRZYGWOŹDZIŁEM BUGA SKURWYSYNA!

Chwalić Swaroga, że aplikacja w kompilacji Debug też się wywalała. W takim wypadku wiadomo było co robić, attach Qt Creatora do procesu, i przeszukanie stosu - tym razem było pokazane gdzie w moim kodzie się posypało. Oto co się okazało - miałem sobie taką klasę:

class CostCalculator
{
public:
    CostCalculator(unsigned int baseCost);
    ~CostCalculator() = default;

    unsigned int calculateCost() const;

    void equipmentCostChange(int itemCostDelta);
    void armorCostChange(int armorAmountDelta);

    void operator=(const CostCalculator &other);

private:
    static unsigned int adjustmentThreshold;
    static unsigned int armorCostPerPoint;

    unsigned int baseCost = 0;
    unsigned int totalEquipmentCost = 0;
    unsigned int totalArmor = 0;
};
//i .cpp
#include "costcalculator.h"

unsigned int CostCalculator::adjustmentThreshold = SettingsFileDatabase::getInstance().getCostAlignmentThreshold();
unsigned int CostCalculator::armorCostPerPoint = GameConstantsDatabase::getInstance().getArmorCostPerPoint();

CostCalculator::CostCalculator(unsigned int baseCost)
:baseCost(baseCost)
{    
}

void CostCalculator::operator=(const CostCalculator &other)
{
    baseCost = other.baseCost;
    totalArmor = other.totalArmor;
    totalEquipmentCost = other.totalEquipmentCost;
}

unsigned int CostCalculator::calculateCost() const
{
    uint cost = baseCost + totalEquipmentCost;
    cost += totalArmor * armorCostPerPoint;
    //adjust the cost up to nearest threshold
    cost = ceil((double)cost / (double)adjustmentThreshold) * adjustmentThreshold;
    return cost;
}

void CostCalculator::equipmentCostChange(int itemCostDelta)
{
    totalEquipmentCost += itemCostDelta;
}

void CostCalculator::armorCostChange(int armorAmountDelta)
{
    totalArmor += armorAmountDelta;
}

Owe Database to leniwe singletony, tworzone kiedy po raz pierwszy wywoła się getInstance():

SettingsFileDatabase& SettingsFileDatabase::getInstance()
{
    static SettingsFileDatabase manager;
    return manager;
}

i to owe zmienne adjustmentThreshold oraz armorCostPerPoint przy zdefiniowaniu jako static powodują wywrotkę aplikacji. Jak dałem je jako zwykłe pola klasy, inicjowane w konstruktorze to problem ustąpił.

Co jeszcze - flaga kompilacji jakiej używam w .pro

Release: QMAKE_CXXFLAGS += -O3 -mpreferred-stack-boundary=2 -finline-small-functions -momit-leaf-frame-pointer

1 użytkowników online, w tym zalogowanych: 0, gości: 1