Mam wielowątkową aplikację OS X, która używa mieszaniny C++, Objective-C i Swift.Jak wyśledzić "libC++ abi.dylib: Czysta wirtualna funkcja nazywana!" w Xcode
Kiedy moja aplikacja zostanie zamknięty, widzę to w oknie Xcode debuggera:
libc++abi.dylib: Pure virtual function called!
wiem, że ten błąd jest zazwyczaj spowodowane przez wywołanie funkcji wirtualnych w C klasy konstruktora lub destruktora ++.
Czy istnieje prosty sposób na znalezienie miejsca? Przez "Easy" mam na myśli "nie analizowanie drzew wywołań dla każdej linii każdego konstruktora i destruktora każdej klasy, która ma funkcję wirtualną".
Nie widzę śladu stosu. Debugger nie zatrzymuje programu po wydrukowaniu tego komunikatu. Komunikat rejestrowany w metodzie delegata mojej aplikacji applicationDidTerminate
poprzedza tę wiadomość.
Próbowałem ustawić punkt przerwania na "Wszystkie wyjątki", ale niestety ten punkt przerwania jest często trafiony przez kod, który używa wielu wyjątków. Czy jest jakiś inny symbol, w którym mogę umieścić punkt przerwania?
przyjrzyj się dowolnej klasie, która wywołuje metodę wirtualną w swoim destruktorze, lub wywołuje dowolną metodę w jej destruktorze - ponieważ metody te mogą same wywoływać metody wirtualne. W destruktorze klasy bazowej klasa pochodna już nie istnieje, więc wirtualne wywołania funkcji wykonają wersję klasy podstawowej. –
Zazwyczaj generowany jest raport z dziennika awarii, ponieważ ten błąd jest wyjątkiem "SIGABRT". W przypadku, gdy nie ma wtedy, możesz przeszukać kod dla "wirtualny" i ustawić punkty przerwania na każdym z nich; powinno to być po prostu kwestią procesu eliminacji. –
Ustaw punkt przerwania na '__cxa_pure_virtual' –