Czy istnieje sposób w C++ 11 (przy użyciu najnowszego GCC), aby uzyskać nazwę, lub numer pliku i linii, , metodę nazywającą aktualnie wykonywaną metodę (wywołującą)?Jak uzyskać nazwę lub plik i linię metody dzwoniącego?
Chcę skorzystać z tej informacji w komunikacie o błędzie, gdy na przykład, poniższy kod nie powiedzie się:
void SomewhereInMyProgram()
{
DoSomething(nullptr);
}
void DoSomething(const char* str)
{
Contract::Requires(str != nullptr);
// ...
}
Obecnie mam kod w miejscu, które zgłasza błąd jak występujący w DoSomething
. Chociaż jest to prawdą techniczną, chciałbym zgłosić błąd występujący w SomewhereInMyProgram
w dowolnym miejscu. To ułatwiłoby mi życie!
Rozwiązanie może korzystać z dowolnych funkcji C++ 11, makr lub GCC, ale raczej nie jest to coś, co muszę dodać na każdej stronie wywołania.
Myślę, że stacktrace będzie nie mi pomóc, ponieważ nie mogę używać obsługi wyjątków. Właściwie jestem bardzo ograniczony: jest to środowisko wolnostojące, w którym standardowe nagłówki C++ nie są dostępne. Miałem nadzieję na jakieś makro rozwiązanie.
class Contract
{
public:
static void RequiresImpl(bool condition, const char* expression,
const char* file, int line);
#define Requires(condition) RequiresImpl(condition, #condition , \
__FILE__, __LINE__)
};
Wygląda na to, że szukasz ścieżki stosu w środowisku wykonawczym, tzn. Spójrz na to pytanie SO (w jaki sposób uzyskują stos śledzenia) http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace- when-my-gcc-c-app-crashes – epatel
@epatel Nie jestem ** nie ** szukając stosu, ponieważ nie mogę używać wyjątków. Nawiasem mówiąc, z pewnością nie zadaję tego samego pytania, które zaznaczyłeś duplikatem? – Virtlink
Chodziło mi o to, że powinieneś zajrzeć do funkcji 'handler()', aby sprawdzić, w jaki sposób uzyskuje się tam ślad stosu, tj. Funkcje 'backtrace()', 'backtrace_symbols()' i 'backtrace_symbols_fd()'. Spróbuj użyć ich w tym samym miejscu, w którym chcesz uzyskać "dzwoniącego" – epatel