2 * Copyright (C) 2013 Paul Woegerer <paul_woegerer@mentor.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include <sys/types.h>
33 #include <usterr-signal-safe.h>
34 #include "lttng-tracer-core.h"
35 #include "lttng-ust-baddr.h"
37 #define TRACEPOINT_DEFINE
38 #define TRACEPOINT_CREATE_PROBES
39 #define TP_SESSION_CHECK
40 #include "ust_baddr_statedump.h"
44 void *exec_baddr
; /* executable base address */
48 * Trace baddr into all sessions for which statedump is pending owned by
52 int trace_baddr(void *base_addr_ptr
,
53 const char *resolved_path
,
57 struct cds_list_head
*sessionsp
;
58 struct lttng_session
*session
;
61 if (vdso
|| stat(resolved_path
, &sostat
)) {
66 * UST lock nests within dynamic loader lock.
70 * Stop iteration on headers if need to exit.
76 sessionsp
= _lttng_get_sessions();
77 cds_list_for_each_entry(session
, sessionsp
, node
) {
78 if (session
->owner
!= owner
)
80 if (!session
->statedump_pending
)
82 tracepoint(ust_baddr_statedump
, soinfo
,
83 session
, base_addr_ptr
,
84 resolved_path
, sostat
.st_size
,
92 int extract_soinfo_events(struct dl_phdr_info
*info
, size_t size
, void *_data
)
95 struct extract_data
*data
= _data
;
96 void *owner
= data
->owner
;
98 for (j
= 0; j
< info
->dlpi_phnum
; j
++) {
99 char resolved_path
[PATH_MAX
];
103 if (info
->dlpi_phdr
[j
].p_type
!= PT_LOAD
)
106 /* Calculate virtual memory address of the loadable segment */
107 base_addr_ptr
= (void *) info
->dlpi_addr
108 + info
->dlpi_phdr
[j
].p_vaddr
;
110 if ((info
->dlpi_name
== NULL
|| info
->dlpi_name
[0] == 0)
111 && !data
->exec_baddr
) {
113 * Only the first phdr encountered is considered
114 * as the program executable. The following
115 * could be e.g. vdso. Don't mistakenly dump
116 * them as being the program executable.
118 data
->exec_baddr
= base_addr_ptr
;
120 * Deal with program executable outside of phdr
125 if (info
->dlpi_name
== NULL
|| info
->dlpi_name
[0] == 0) {
127 snprintf(resolved_path
, PATH_MAX
- 1, "[vdso]");
131 * For regular dl_phdr_info entries we have to check if
132 * the path to the shared object really exists.
134 if (!realpath(info
->dlpi_name
, resolved_path
)) {
135 /* Path unknown, put the 'path' into brackets */
136 snprintf(resolved_path
, PATH_MAX
- 1, "[%s]",
141 if (trace_baddr(base_addr_ptr
, resolved_path
, vdso
, owner
)) {
145 * We are only interested in the base address (lowest virtual
146 * address associated with the memory image), skip the rest
154 void dump_exec_baddr(struct extract_data
*data
)
156 void *owner
= data
->owner
;
158 char exe_path
[PATH_MAX
];
161 base_addr_ptr
= data
->exec_baddr
;
165 * We have to use /proc/self/exe to determine the executable full
168 exe_len
= readlink("/proc/self/exe", exe_path
, sizeof(exe_path
) - 1);
171 exe_path
[exe_len
] = '\0';
172 trace_baddr(base_addr_ptr
, exe_path
, 0, owner
);
175 int lttng_ust_baddr_statedump(void *owner
)
177 struct extract_data data
;
179 if (!getenv("LTTNG_UST_WITH_EXPERIMENTAL_BADDR_STATEDUMP"))
183 data
.exec_baddr
= NULL
;
185 * Iterate through the list of currently loaded shared objects and
186 * generate events for loadable segments using
187 * extract_soinfo_events.
189 dl_iterate_phdr(extract_soinfo_events
, &data
);
191 * We cannot call dladdr() from within phdr iteration, without
192 * causing constructor vs dynamic loader vs multithread internal
193 * deadlocks, so dump the executable outside of the phdr
196 dump_exec_baddr(&data
);
200 void lttng_ust_baddr_statedump_init(void)
202 __tracepoints__init();
203 __tracepoints__ptrs_init();
204 __lttng_events_init__ust_baddr_statedump();
207 void lttng_ust_baddr_statedump_destroy(void)
209 __lttng_events_exit__ust_baddr_statedump();
210 __tracepoints__ptrs_destroy();
211 __tracepoints__destroy();
This page took 0.034399 seconds and 5 git commands to generate.