1 /*******************************************************************************
2 * Copyright (c) 2015 EfficiOS Inc., Alexandre Montplaisir
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *******************************************************************************/
10 package org
.eclipse
.tracecompass
.lttng2
.ust
.core
.analysis
.debuginfo
;
12 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.nullToEmptyString
;
14 import org
.eclipse
.jdt
.annotation
.Nullable
;
15 import org
.eclipse
.tracecompass
.lttng2
.ust
.core
.trace
.LttngUstTrace
;
16 import org
.eclipse
.tracecompass
.lttng2
.ust
.core
.trace
.layout
.ILttngUstEventLayout
;
17 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
18 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEventField
;
19 import org
.eclipse
.tracecompass
.tmf
.core
.event
.aspect
.ITmfEventAspect
;
20 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceUtils
;
23 * Event aspect of UST traces that indicate the binary callsite (binary, symbol
24 * and offset) from an IP (instruction pointer) context.
26 * Unlike the {@link UstDebugInfoSourceAspect}, this information should be
27 * available even without debug information.
29 * @author Alexandre Montplaisir
32 public class UstDebugInfoBinaryAspect
implements ITmfEventAspect
<BinaryCallsite
> {
34 /** Singleton instance */
35 public static final UstDebugInfoBinaryAspect INSTANCE
= new UstDebugInfoBinaryAspect();
37 private UstDebugInfoBinaryAspect() {
41 public String
getName() {
42 return nullToEmptyString(Messages
.UstDebugInfoAnalysis_BinaryAspectName
);
46 public String
getHelpText() {
47 return nullToEmptyString(Messages
.UstDebugInfoAnalysis_BinaryAspectHelpText
);
51 public @Nullable BinaryCallsite
resolve(ITmfEvent event
) {
52 /* This aspect only supports UST traces */
53 if (!(event
.getTrace() instanceof LttngUstTrace
)) {
56 LttngUstTrace trace
= (LttngUstTrace
) event
.getTrace();
58 ILttngUstEventLayout layout
= trace
.getEventLayout();
60 /* We need both the vpid and ip contexts */
61 ITmfEventField vpidField
= event
.getContent().getField(layout
.contextVpid());
62 ITmfEventField ipField
= event
.getContent().getField(layout
.contextIp());
63 if (ipField
== null) {
64 ipField
= event
.getContent().getField(layout
.fieldAddr());
66 if (vpidField
== null || ipField
== null) {
69 Long vpid
= (Long
) vpidField
.getValue();
70 Long ip
= (Long
) ipField
.getValue();
71 long ts
= event
.getTimestamp().toNanos();
73 return getBinaryCallsite(trace
, vpid
.intValue(), ts
, ip
.longValue());
77 * Get the binary callsite (which means binary file and offset in this file)
78 * corresponding to the given instruction pointer, for the given PID and
82 * The trace, from which we will get the debug info analysis
84 * The PID for which we want the symbol
86 * The timestamp of the query
88 * The instruction pointer address
89 * @return The {@link BinaryCallsite} object with the relevant information
91 public static @Nullable BinaryCallsite
getBinaryCallsite(LttngUstTrace trace
, int pid
, long ts
, long ip
) {
93 * First match the IP to the correct binary or library, by using the
94 * UstDebugInfoAnalysis.
96 UstDebugInfoAnalysisModule module
= TmfTraceUtils
.getAnalysisModuleOfClass(trace
,
97 UstDebugInfoAnalysisModule
.class, UstDebugInfoAnalysisModule
.ID
);
100 * The analysis is not available for this trace, we won't be able to
101 * find the information.
105 UstDebugInfoLoadedBinaryFile file
= module
.getMatchingFile(ts
, pid
, ip
);
110 /* Apply the path prefix defined by the trace, if any */
111 String fullPath
= (trace
.getSymbolProviderConfig().getActualRootDirPath() + file
.getFilePath());
115 offset
= ip
- file
.getBaseAddress();
118 * In the case of the object being non-position-independent, we must
119 * pass the actual 'ip' address directly to addr2line.
124 return new BinaryCallsite(fullPath
, file
.getBuildId(), offset
, file
.isPic());