sp_dbg_trace.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "precompile.h"
  2. #include "sp_dbg_export.h"
  3. #include "sp_gui_def.h"
  4. #include "sp_def.h"
  5. #include "sp_dir.h"
  6. #include "log.h"
  7. #include <stdarg.h>
  8. #include "fileutil.h"
  9. #include "memutil.h"
  10. #include <winpr/string.h>
  11. #include "dbgutil.h"
  12. #define MAX_ERR_TRACE_MSG_LEN 512
  13. #define MAX_ERR_TRACE_DEEP 100
  14. typedef struct err_stack_item
  15. {
  16. char err_msg[MAX_ERR_TRACE_MSG_LEN];
  17. } err_stack_item;
  18. typedef struct err_stack
  19. {
  20. err_stack_item* msgs[MAX_ERR_TRACE_DEEP];
  21. int map_idx[MAX_ERR_TRACE_DEEP];
  22. int cur_trace_idx;
  23. } err_stack;
  24. static err_stack* g_track;
  25. SPBASE_API void sp_trace_init()
  26. {
  27. if (!g_track) {
  28. int i = 0;
  29. g_track = MALLOC_T(err_stack);
  30. memset(g_track, 0, sizeof(err_stack));
  31. g_track->cur_trace_idx = -1;
  32. for (i = 0; i < MAX_ERR_TRACE_DEEP; ++i) {
  33. g_track->map_idx[i] = -1;
  34. g_track->msgs[i] = NULL;
  35. }
  36. }
  37. }
  38. SPBASE_API void sp_trace_append(const char* str)
  39. {
  40. int i, len;
  41. len = strlen(str);
  42. if (g_track && str != NULL && len > 0) {
  43. int next_idx = g_track->cur_trace_idx + 1;
  44. if (!g_track->msgs[next_idx]) {
  45. g_track->msgs[next_idx] = MALLOC_T(err_stack_item);
  46. memset(g_track->msgs[next_idx], 0, sizeof(err_stack_item));
  47. //TOOLKIT_ASSERT(g_track->map_idx[next_idx] == (char)-1);
  48. }
  49. strcpy(g_track->msgs[next_idx]->err_msg, str);
  50. len = len > MAX_ERR_TRACE_MSG_LEN - 1 ? MAX_ERR_TRACE_MSG_LEN - 1 : len;
  51. g_track->msgs[next_idx]->err_msg[len] = '\0';
  52. for (i = MAX_ERR_TRACE_DEEP - 1; i >= 1; i--) { g_track->map_idx[i] = g_track->map_idx[i - 1]; }
  53. g_track->map_idx[0] = next_idx;
  54. g_track->cur_trace_idx++;
  55. if (g_track->cur_trace_idx == MAX_ERR_TRACE_DEEP - 1)
  56. g_track->cur_trace_idx = -1;
  57. }
  58. }
  59. SPBASE_API void sp_trace_retrieve(char** trace_ptr, uint32_t* trace_cnt)
  60. {
  61. int i;
  62. size_t len;
  63. if (trace_ptr && g_track) {
  64. for (len = 0, i = 0; i < MAX_ERR_TRACE_DEEP; i++) {
  65. const int idx = g_track->map_idx[i];
  66. if (idx != -1) {
  67. len += (strlen(g_track->msgs[idx]->err_msg) + strlen("\n"));
  68. }
  69. }
  70. if (len > 0) {
  71. char* content = CALLOC_T((len), char);
  72. for (i = 0; i < MAX_ERR_TRACE_DEEP; ++i) {
  73. const int idx = g_track->map_idx[i];
  74. if (idx != -1) {
  75. if (i != 0) strcat(content, "\n");
  76. strcat(content, g_track->msgs[idx]->err_msg);
  77. }
  78. }
  79. content[len - 1] = '\0';
  80. if (trace_ptr) { *trace_ptr = content; } else FREE(content);
  81. if (trace_cnt) { *trace_cnt = len; }
  82. }
  83. }
  84. }
  85. SPBASE_API void sp_trace_term()
  86. {
  87. if (g_track) {
  88. int i;
  89. for (i = 0; i < MAX_ERR_TRACE_DEEP; ++i) {
  90. if (g_track->msgs[i]) {
  91. FREE(g_track->msgs[i]);
  92. }
  93. }
  94. FREE(g_track);
  95. }
  96. }
  97. SPBASE_API int sp_trace_exist()
  98. {
  99. return (g_track != NULL);
  100. }