source: titan/titan/debug.h @ 23187

Last change on this file since 23187 was 23187, checked in by nit, 7 years ago

[titan] add new stack trace for dev images

File size: 4.0 KB
Line 
1/*****************************************************/
2/* this file is part of the tiTan / tiTanNIT Project */
3/* and allowed only for use with this.               */
4/*                                                   */
5/* copyright by NIT                                  */
6/*****************************************************/
7
8#ifndef DEBUG_H
9#define DEBUG_H
10
11short debug_level = 10;
12
13// mc debug_level = 50;
14// panel debug_level = 60;
15
16void __cyg_profile_func_enter(void *this_fn, void* call_size) __attribute__((no_instrument_function));
17void __cyg_profile_func_enter(void *this_fn, void* call_size)
18{
19        int i = 0, freeid = -1;
20        pthread_t threadid = pthread_self();
21
22        for(i = 0; i < MAXSTACKTRACE; i++)
23        {
24                if(stacktrace[i].thread == NULL && freeid == -1) freeid = i;
25                if(stacktrace[i].thread == threadid)
26                {
27                        stacktrace[i].func[stacktrace[i].pos] = this_fn;
28                        stacktrace[i].pos++;
29                        if(stacktrace[i].pos >= MAXSTACKTRACE - 1) stacktrace[i].pos = MAXSTACKTRACE - 1;
30                        freeid = -2;
31                }
32        }
33
34        if(freeid >= -1)
35        {
36                stacktrace[freeid].thread = threadid;
37                stacktrace[freeid].func[stacktrace[freeid].pos] = this_fn;
38                stacktrace[freeid].pos++;
39                if(stacktrace[i].pos >= MAXSTACKTRACE) stacktrace[i].pos = MAXSTACKTRACE - 1;
40        }
41}
42
43void __cyg_profile_func_exit(void *this_fn, void* call_size) __attribute__((no_instrument_function));
44void __cyg_profile_func_exit(void *this_fn, void* call_size)
45{
46        int i = 0;
47        pthread_t threadid = pthread_self();
48
49        for(i = 0; i < MAXSTACKTRACE; i++)
50        {
51                if(stacktrace[i].thread == threadid)
52                {
53                        stacktrace[i].pos--;
54                        if(stacktrace[i].pos < 0) stacktrace[i].pos = 0;
55                        stacktrace[i].func[stacktrace[i].pos] = NULL;
56                        if(stacktrace[i].pos == 0) stacktrace[i].thread = NULL;
57                }
58        }
59}
60
61//debug
62//first line shows greater/same debuglevel
63//second line shows only same debuglevel
64//#define debug(level, fmt, args...) if(debug_level >= level) { do { printf("[%s] " fmt, PROGNAME, ##args); } while (0); printf(", file=%s, func=%s, line=%d\n", __FILE__, __FUNCTION__, __LINE__); }
65//#define debug(level, fmt, args...) if(debug_level == level) { do { printf("[%s] " fmt, PROGNAME, ##args); } while (0); printf(", file=%s, func=%s, line=%d\n", __FILE__, __FUNCTION__, __LINE__); }
66void debugfunc(int level, char* file, const char* function, int line, char* msg, ...)
67{
68        if(debug_level == level)
69        {
70                va_list ap;
71                va_start(ap, msg);
72                printf("[%s] ", PROGNAME);
73                vfprintf(stdout, msg, ap);
74                va_end(ap);
75                fprintf(stdout, ", file=%s, func=%s, line=%d\n", file, function, line);
76        }
77}
78#define debug(level, msg...) debugfunc(level, __FILE__, __FUNCTION__, __LINE__, msg);
79
80//err
81//#define err(fmt, args...) { do { fprintf(stderr, "[%s] error: " fmt, PROGNAME, ##args); } while (0); fprintf(stderr, ", file=%s, func=%s, line=%d\n", __FILE__, __FUNCTION__, __LINE__); }
82void errfunc(char* file, const char* function, int line, char* msg, ...)
83{
84        va_list ap;
85        va_start(ap, msg);
86        fprintf(stderr, "[%s] error: ", PROGNAME);
87        vfprintf(stderr, msg, ap);
88        va_end(ap);
89        fprintf(stderr, ", file=%s, func=%s, line=%d\n", file, function, line);
90}
91#define err(msg...) errfunc(__FILE__, __FUNCTION__, __LINE__, msg);
92
93//perr
94//#define perr(fmt, args...) { do { fprintf(stderr, "[%s] error: " fmt, PROGNAME, ##args); } while (0); fprintf(stderr, ", err=%m, file=%s, func=%s, line=%d\n", __FILE__, __FUNCTION__, __LINE__); }
95void perrfunc(char* file, const char* function, int line, char* msg, ...)
96{
97        va_list ap;
98        va_start(ap, msg);
99        fprintf(stderr, "[%s] error: ", PROGNAME);
100        vfprintf(stderr, msg, ap);
101        va_end(ap);
102        fprintf(stderr, ", err=%m, file=%s, func=%s, line=%d\n", file, function, line);
103}
104#define perr(msg...) perrfunc(__FILE__, __FUNCTION__, __LINE__, msg);
105
106//filedebug
107//#define filedebug(file, fmt, args...) { FILE* fd = fopen(file, "a"); if(fd != NULL) { do { fprintf(fd, "" fmt, ##args); } while (0); fprintf(fd, "\n"); }}
108void filedebugfunc(char* file, char* msg, ...)
109{
110        FILE* fd = fopen(file, "a"); 
111        if(fd != NULL)
112        {
113                va_list ap;
114                va_start(ap, msg);
115                vfprintf(fd, msg, ap);
116                va_end(ap);
117                fprintf(fd, "\n");
118                fclose(fd);
119        }
120}
121#define filedebug(file, msg...) filedebugfunc(file, msg);
122
123#endif
Note: See TracBrowser for help on using the repository browser.