use of org.eclipse.tracecompass.lttng2.ust.core.analysis.debuginfo.UstDebugInfoLoadedBinaryFile in project tracecompass by tracecompass.
the class UstDebugInfoAnalysisModule method getMatchingFile.
/**
* Get the binary file (executable or library) that corresponds to a given
* instruction pointer, at a given time.
*
* @param ts
* The timestamp
* @param vpid
* The VPID of the process we are querying for
* @param ip
* The instruction pointer of the trace event. Normally comes
* from a 'ip' context.
* @return A {@link UstDebugInfoLoadedBinaryFile} object, describing the
* binary file and its base address.
* @noreference Meant to be used internally by
* {@link UstDebugInfoBinaryAspect} only.
*/
@VisibleForTesting
@Nullable
public UstDebugInfoLoadedBinaryFile getMatchingFile(long ts, long vpid, long ip) {
try {
final ITmfStateSystem ss = getStateSystem();
if (ss == null) {
/* State system might not yet be initialized */
return null;
}
// $NON-NLS-1$
List<Integer> possibleBaddrQuarks = ss.getQuarks(String.valueOf(vpid), "*");
List<ITmfStateInterval> state = ss.queryFullState(ts);
/* Get the most probable base address from all the known ones */
OptionalLong potentialBaddr = possibleBaddrQuarks.stream().filter(quark -> Objects.equals(1, state.get(quark).getValue())).map(ss::getAttributeName).mapToLong(Long::parseLong).filter(baddr -> baddr <= ip).max();
if (!potentialBaddr.isPresent()) {
return null;
}
long baddr = potentialBaddr.getAsLong();
final int baddrQuark = ss.getQuarkAbsolute(String.valueOf(vpid), String.valueOf(baddr));
final int memszQuark = ss.getQuarkRelative(baddrQuark, UstDebugInfoStateProvider.MEMSZ_ATTRIB);
final long memsz = state.get(memszQuark).getStateValue().unboxLong();
/* Make sure the 'ip' fits the range of this object. */
if (!(ip < baddr + memsz)) {
/*
* Not the correct memory range after all. We do not have
* information about the library that was loaded here.
*/
return null;
}
final int pathQuark = ss.getQuarkRelative(baddrQuark, UstDebugInfoStateProvider.PATH_ATTRIB);
String filePath = state.get(pathQuark).getStateValue().unboxStr();
final int buildIdQuark = ss.getQuarkRelative(baddrQuark, UstDebugInfoStateProvider.BUILD_ID_ATTRIB);
ITmfStateValue buildIdValue = state.get(buildIdQuark).getStateValue();
String buildId = unboxStrOrNull(buildIdValue);
final int debugLinkQuark = ss.getQuarkRelative(baddrQuark, UstDebugInfoStateProvider.DEBUG_LINK_ATTRIB);
ITmfStateValue debugLinkValue = state.get(debugLinkQuark).getStateValue();
String debugLink = unboxStrOrNull(debugLinkValue);
final int isPicQuark = ss.getQuarkRelative(baddrQuark, UstDebugInfoStateProvider.IS_PIC_ATTRIB);
boolean isPic = state.get(isPicQuark).getStateValue().unboxInt() != 0;
// The baddrQuark interval lasts for the time this file is loaded
ITmfStateInterval validityInterval = state.get(baddrQuark);
return new UstDebugInfoLoadedBinaryFile(baddr, filePath, buildId, debugLink, isPic, validityInterval.getStartTime(), validityInterval.getEndTime());
} catch (AttributeNotFoundException | TimeRangeException | StateSystemDisposedException e) {
/* Either the data is not available yet, or incomplete. */
return null;
}
}
use of org.eclipse.tracecompass.lttng2.ust.core.analysis.debuginfo.UstDebugInfoLoadedBinaryFile in project tracecompass by tracecompass.
the class UstDebugInfoAnalysisModuleTest method testBuildIDDebugLink.
/**
* Test the analysis with a trace with debug_link information.
*/
@Test
public void testBuildIDDebugLink() {
UstDebugInfoLoadedBinaryFile matchingFile, expected;
LttngUstTrace trace = LttngUstTestTraceUtils.getTrace(SYNTH_BUILDID_DEBUGLINK_TRACE);
executeModule(trace);
expected = new UstDebugInfoLoadedBinaryFile(0x400000, "/tmp/foo_nn", null, null, false);
matchingFile = fModule.getMatchingFile(17000000, 1337, 0x400100);
assertEquals(expected, matchingFile);
expected = new UstDebugInfoLoadedBinaryFile(0x400000, "/tmp/foo_yn", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", null, false);
matchingFile = fModule.getMatchingFile(18000000, 1338, 0x400100);
assertEquals(expected, matchingFile);
expected = new UstDebugInfoLoadedBinaryFile(0x400000, "/tmp/foo_ny", null, "/tmp/debug_link1", false);
matchingFile = fModule.getMatchingFile(19000000, 1339, 0x400100);
assertEquals(expected, matchingFile);
expected = new UstDebugInfoLoadedBinaryFile(0x400000, "/tmp/foo_yy", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "/tmp/debug_link2", false);
matchingFile = fModule.getMatchingFile(20000000, 1340, 0x400100);
assertEquals(expected, matchingFile);
LttngUstTestTraceUtils.dispose(SYNTH_BUILDID_DEBUGLINK_TRACE);
}
use of org.eclipse.tracecompass.lttng2.ust.core.analysis.debuginfo.UstDebugInfoLoadedBinaryFile in project tracecompass by tracecompass.
the class UstDebugInfoAnalysisModuleTest method testExec.
/**
* Test the analysis with a test trace doing an "exec" system call.
*/
@Test
public void testExec() {
UstDebugInfoLoadedBinaryFile matchingFile, expected;
int vpid = 1337;
LttngUstTrace trace = LttngUstTestTraceUtils.getTrace(SYNTH_EXEC_TRACE);
executeModule(trace);
expected = new UstDebugInfoLoadedBinaryFile(0x400000, "/tmp/foo", null, null, false);
matchingFile = fModule.getMatchingFile(4000000, vpid, 0x400100);
assertEquals(expected, matchingFile);
expected = null;
matchingFile = fModule.getMatchingFile(8000000, vpid, 0x400100);
assertEquals(expected, matchingFile);
expected = new UstDebugInfoLoadedBinaryFile(0x500000, "/tmp/bar", null, null, false);
matchingFile = fModule.getMatchingFile(9000000, vpid, 0x500100);
assertEquals(expected, matchingFile);
LttngUstTestTraceUtils.dispose(SYNTH_EXEC_TRACE);
}
use of org.eclipse.tracecompass.lttng2.ust.core.analysis.debuginfo.UstDebugInfoLoadedBinaryFile in project tracecompass by tracecompass.
the class UstDebugInfoAnalysisModuleTest method testTwoProcesses.
/**
* Test the analysis with a test trace with two processes doing a statedump
* simultaneously.
*/
@Test
public void testTwoProcesses() {
UstDebugInfoLoadedBinaryFile matchingFile, expected;
int vpid1 = 1337;
int vpid2 = 2001;
LttngUstTrace trace = LttngUstTestTraceUtils.getTrace(SYNTH_TWO_PROCESSES_TRACE);
executeModule(trace);
expected = new UstDebugInfoLoadedBinaryFile(0x400000, "/tmp/foo", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "/tmp/debuglink1", false);
matchingFile = fModule.getMatchingFile(11000000, vpid1, 0x400100);
assertEquals(expected, matchingFile);
expected = new UstDebugInfoLoadedBinaryFile(0x400000, "/tmp/bar", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "/tmp/debuglink2", false);
matchingFile = fModule.getMatchingFile(12000000, vpid2, 0x400100);
assertEquals(expected, matchingFile);
LttngUstTestTraceUtils.dispose(SYNTH_TWO_PROCESSES_TRACE);
}
Aggregations