diff --git a/server/gameserver/CMakeLists.txt b/server/gameserver/CMakeLists.txt index ca2403d4..972efe68 100644 --- a/server/gameserver/CMakeLists.txt +++ b/server/gameserver/CMakeLists.txt @@ -145,6 +145,8 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug") target_link_libraries( gameserver${GAME_ID} behaviac_gcc_debug + boost_stacktrace_backtrace + boost_stacktrace_addr2line ) else() target_link_libraries( diff --git a/server/gameserver/hero_agent.h b/server/gameserver/hero_agent.h index 7496985d..4a110a1a 100644 --- a/server/gameserver/hero_agent.h +++ b/server/gameserver/hero_agent.h @@ -92,6 +92,9 @@ public: int SearchPickupObj(); bool PickupObjIsValid(); void AbandonPickup(int min_time, int max_time); + bool HasThrowItem(int slot); + bool CanThrowItem(int slot); + bool ThrowItem(int slot); behaviac::EBTStatus RegisterEvents(behaviac::vector events); behaviac::EBTStatus ClearEvents(); diff --git a/server/gameserver/tracemgr.cc b/server/gameserver/tracemgr.cc index 60cc0a44..e03ea160 100644 --- a/server/gameserver/tracemgr.cc +++ b/server/gameserver/tracemgr.cc @@ -1,34 +1,23 @@ #include "precompile.h" -#include +#include #include "tracemgr.h" #ifdef DEBUG -#if __GNUC__ > 4 -static void ErrorCallback(void *data, const char *msg, int errnum) -{ - A8_ABORT(); -} -#endif +#define BOOST_STACKTRACE_USE_ADDR2LINE +#include + void TraceMgr::Init(const std::string& filename) { filename_ = filename; -#if __GNUC__ > 4 - state_ = backtrace_create_state(filename_.c_str(), - 0, - ErrorCallback, - nullptr); - if (!state_) { - A8_ABORT(); - } -#endif log_file_ = fopen("backtrace.log", "w"); if (!log_file_) { A8_ABORT(); } + PrintBackTrace(); } void TraceMgr::UnInit() @@ -41,33 +30,11 @@ void TraceMgr::UnInit() void TraceMgr::Trace(const std::string& hint) { -#if __GNUC__ > 4 - fputs(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n", log_file_); - fputs(hint.c_str(), log_file_); - backtrace_print(state_, 0, log_file_); - fputs("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", log_file_); -#endif } -std::string TraceMgr::GetBackTrace() +void TraceMgr::PrintBackTrace() { - const int BT_BUF_SIZE = 1024 * 10; - - std::string data; - - void *buffer[BT_BUF_SIZE]; - char **strings = nullptr; - int nptrs = backtrace(buffer, BT_BUF_SIZE); - strings = backtrace_symbols(buffer, nptrs); - if (strings) { - for (int i = 0; i < nptrs; i++) { - data += strings[i]; - data += "\n"; - } - free(strings); - } - - return data; + std::cout << boost::stacktrace::stacktrace(); } #endif diff --git a/server/gameserver/tracemgr.h b/server/gameserver/tracemgr.h index 7e0f0785..9eb1b76e 100644 --- a/server/gameserver/tracemgr.h +++ b/server/gameserver/tracemgr.h @@ -4,10 +4,6 @@ #ifdef DEBUG -#if __GNUC__ > 4 -#include -#endif - class TraceMgr : public a8::Singleton { @@ -21,13 +17,10 @@ class TraceMgr : public a8::Singleton void UnInit(); void Trace(const std::string& hint); - std::string GetBackTrace(); + void PrintBackTrace(); private: std::string filename_; -#if __GNUC__ > 4 - backtrace_state* state_ = nullptr; -#endif FILE* log_file_ = nullptr; };