Branch data Line data Source code
1 : : /*
2 : : * Copyright (c) 2008, 2009, 2010, 2011, 2013 Nicira, Inc.
3 : : *
4 : : * Licensed under the Apache License, Version 2.0 (the "License");
5 : : * you may not use this file except in compliance with the License.
6 : : * You may obtain a copy of the License at:
7 : : *
8 : : * http://www.apache.org/licenses/LICENSE-2.0
9 : : *
10 : : * Unless required by applicable law or agreed to in writing, software
11 : : * distributed under the License is distributed on an "AS IS" BASIS,
12 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 : : * See the License for the specific language governing permissions and
14 : : * limitations under the License.
15 : : */
16 : :
17 : : #include <config.h>
18 : : #include <inttypes.h>
19 : :
20 : : #include "backtrace.h"
21 : : #include "openvswitch/vlog.h"
22 : :
23 : 22484 : VLOG_DEFINE_THIS_MODULE(backtrace);
24 : :
25 : : #ifdef HAVE_BACKTRACE
26 : : #include <execinfo.h>
27 : : void
28 : 0 : backtrace_capture(struct backtrace *b)
29 : : {
30 : : void *frames[BACKTRACE_MAX_FRAMES];
31 : : int i;
32 : :
33 : 0 : b->n_frames = backtrace(frames, BACKTRACE_MAX_FRAMES);
34 [ # # ]: 0 : for (i = 0; i < b->n_frames; i++) {
35 : 0 : b->frames[i] = (uintptr_t) frames[i];
36 : : }
37 : 0 : }
38 : :
39 : : #else
40 : : void
41 : : backtrace_capture(struct backtrace *backtrace)
42 : : {
43 : : backtrace->n_frames = 0;
44 : : }
45 : : #endif
46 : :
47 : : static char *
48 : 0 : backtrace_format(const struct backtrace *b, struct ds *ds)
49 : : {
50 [ # # ]: 0 : if (b->n_frames) {
51 : : int i;
52 : :
53 : 0 : ds_put_cstr(ds, " (backtrace:");
54 [ # # ]: 0 : for (i = 0; i < b->n_frames; i++) {
55 : 0 : ds_put_format(ds, " 0x%08"PRIxPTR, b->frames[i]);
56 : : }
57 : 0 : ds_put_cstr(ds, ")");
58 : : }
59 : :
60 : 0 : return ds_cstr(ds);
61 : : }
62 : :
63 : : void
64 : 0 : log_backtrace_at(const char *msg, const char *where)
65 : : {
66 : : struct backtrace b;
67 : 0 : struct ds ds = DS_EMPTY_INITIALIZER;
68 : :
69 : 0 : backtrace_capture(&b);
70 [ # # ]: 0 : if (msg) {
71 : 0 : ds_put_format(&ds, "%s ", msg);
72 : : }
73 : :
74 : 0 : ds_put_cstr(&ds, where);
75 [ # # ]: 0 : VLOG_ERR("%s", backtrace_format(&b, &ds));
76 : :
77 : 0 : ds_destroy(&ds);
78 : 0 : }
|