baseEx.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #if (defined _WIN32 || defined _WIN64)
  2. #include "stdafx.h"
  3. #endif
  4. #include "baseEx.h"
  5. #include <thread>
  6. #include <boost/xpressive/xpressive_dynamic.hpp>
  7. #include <boost/algorithm/string.hpp>
  8. #include <boost/filesystem.hpp>
  9. #include <chrono>
  10. #include <signal.h> // ::signal, ::raise
  11. #include <boost/stacktrace.hpp>
  12. #include "CModTools.h"
  13. #include "CWebsocketServer.h"
  14. std::string g_backtracePath = "";
  15. void seg_signal_handler(int signum)
  16. {
  17. //boost::stacktrace::safe_dump_to(g_backtracePath.c_str());
  18. Dbg("receive signal:%d, seg_signal_handler", signum);
  19. auto dumpArr = boost::stacktrace::stacktrace().as_vector();
  20. for (auto i = 0; i < dumpArr.size(); i++)
  21. Dbg("SEG[%d]%X---%s(%s-%d)", i, dumpArr[i].address(), dumpArr[i].name().c_str(), dumpArr[i].source_file().c_str(), dumpArr[i].source_line());
  22. Chromium::CModTools::get_mutable_instance().killAllChromium();
  23. Chromium::CWebsocketServer::stopServer();
  24. signal(signum, SIG_DFL);
  25. raise(signum);
  26. }
  27. void normal_signal_handle(int signum)
  28. {
  29. Dbg("receive signal:%d, normal_signal_handle", signum);
  30. signal(signum, SIG_DFL);
  31. raise(signum);
  32. }
  33. void set_traceback_path(std::string path)
  34. {
  35. g_backtracePath = path + "/mod_chromium/" + generateTimeStr(true) + "_chromium_backtrace.dump";
  36. Dbg("set_traceback_path %s", g_backtracePath.c_str());
  37. }
  38. void DbgEx(const char* str, ...)
  39. {
  40. va_list arg;
  41. va_start(arg, str);
  42. auto modifyStr = CSimpleString::Format("<%d>--%s", std::this_thread::get_id(), str);
  43. vDbg(modifyStr.GetData(), arg);
  44. va_end(arg);
  45. }
  46. std::vector<std::string> find_files(const std::string srcPath, const std::string fileName)
  47. {
  48. static boost::xpressive::sregex_compiler rc;
  49. if (!rc[fileName].regex_id())
  50. {
  51. std::string str = boost::algorithm::replace_all_copy(
  52. boost::algorithm::replace_all_copy(fileName, ".", "\\."), "*", ".*");
  53. rc[fileName] = rc.compile(str);
  54. }
  55. std::vector<std::string> ret;
  56. if (!boost::filesystem::exists(srcPath) || !boost::filesystem::is_directory(srcPath))
  57. return ret;
  58. typedef boost::filesystem::recursive_directory_iterator rd_iterator;
  59. rd_iterator end;
  60. for(rd_iterator pos(srcPath); pos != end; ++pos)
  61. {
  62. if (!boost::filesystem::is_directory(*pos) && boost::xpressive::regex_match(pos->path().filename().string(), rc[fileName]))
  63. ret.push_back(pos->path().string());
  64. }
  65. return ret;
  66. }
  67. std::string generateTimeStr(bool isSimple)
  68. {
  69. auto tt = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
  70. struct tm* ptm = localtime(&tt);
  71. char date[60] = { 0 };
  72. if (isSimple)
  73. sprintf(date, "%02d%02d%02d", (int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec);
  74. else
  75. sprintf(date, "%d-%02d-%02d-%02d:%02d:%02d", (int)ptm->tm_year + 1900, (int)ptm->tm_mon + 1, (int)ptm->tm_mday, (int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec);
  76. return std::string(date);
  77. }