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>
34 #include "lttng-ust-baddr.h"
36 #define TRACEPOINT_DEFINE
37 #include "ust_baddr_statedump.h"
40 int extract_soinfo_events(struct dl_phdr_info
*info
, size_t size
, void *data
)
43 int num_loadable_segment
= 0;
45 struct cds_list_head
*sessionsp
;
47 sessionsp
= _lttng_get_sessions();
49 for (j
= 0; j
< info
->dlpi_phnum
; j
++) {
50 char resolved_path
[PATH_MAX
];
53 struct lttng_session
*session
;
55 if (info
->dlpi_phdr
[j
].p_type
!= PT_LOAD
)
58 /* Calculate virtual memory address of the loadable segment */
59 base_addr_ptr
= (void *) info
->dlpi_addr
60 + info
->dlpi_phdr
[j
].p_vaddr
;
62 num_loadable_segment
+= 1;
63 if ((info
->dlpi_name
== NULL
|| info
->dlpi_name
[0] == 0)
64 && num_loadable_segment
== 1) {
66 * If the iterated element is the executable itself we
67 * have to use Dl_info to determine its full path
69 Dl_info dl_info
= { 0 };
70 if (!dladdr(base_addr_ptr
, &dl_info
))
72 if (!realpath(dl_info
.dli_fname
, resolved_path
))
76 * For regular dl_phdr_info entries we have to check if
77 * the path to the shared object really exists
79 if (!realpath(info
->dlpi_name
, resolved_path
)) {
80 /* Found vDSO, put the 'path' into brackets */
81 snprintf(resolved_path
, PATH_MAX
- 1, "[%s]",
86 if (stat(resolved_path
, &sostat
)) {
92 * UST lock needs to be nested within dynamic loader
96 cds_list_for_each_entry(session
, sessionsp
, node
) {
97 if (session
->owner
!= owner
)
99 if (!session
->statedump_pending
)
101 tracepoint(ust_baddr_statedump
, soinfo
,
102 session
, base_addr_ptr
,
103 resolved_path
, sostat
.st_size
,
109 * We are only interested in the base address (lowest virtual
110 * address associated with the memory image), skip the rest
117 int lttng_ust_baddr_statedump(void *owner
)
119 if (getenv("LTTNG_UST_WITHOUT_BADDR_STATEDUMP"))
122 * Iterate through the list of currently loaded shared objects and
123 * generate events for loadable segments using
124 * extract_soinfo_events.
126 dl_iterate_phdr(extract_soinfo_events
, owner
);
This page took 0.03361 seconds and 6 git commands to generate.