BuildId build_id;
// Add build_ids for kernel/modules.
for (auto& filename : kernel_modules) {
- if (filename == DEFAULT_KERNEL_MMAP_NAME) {
+ if (filename == DEFAULT_KERNEL_FILENAME_FOR_BUILD_ID) {
if (!GetKernelBuildId(&build_id)) {
LOG(DEBUG) << "can't read build_id for kernel";
continue;
return false;
}
ThreadTree thread_tree;
- BuildThreadTree(records, &thread_tree);
for (auto& record : records) {
+ BuildThreadTree(*record, &thread_tree);
if (record->header.type == PERF_RECORD_SAMPLE) {
auto r = *static_cast<const SampleRecord*>(record.get());
bool in_kernel = ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL);
return symbol;
}
-void BuildThreadTree(const std::vector<std::unique_ptr<Record>>& records, ThreadTree* thread_tree) {
- for (auto& record : records) {
- if (record->header.type == PERF_RECORD_MMAP) {
- const MmapRecord& r = *static_cast<const MmapRecord*>(record.get());
- if ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL) {
- thread_tree->AddKernelMap(r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time,
- r.filename);
- } else {
- thread_tree->AddThreadMap(r.data.pid, r.data.tid, r.data.addr, r.data.len, r.data.pgoff,
- r.sample_id.time_data.time, r.filename);
- }
- } else if (record->header.type == PERF_RECORD_MMAP2) {
- const Mmap2Record& r = *static_cast<const Mmap2Record*>(record.get());
- if ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL) {
- thread_tree->AddKernelMap(r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time,
- r.filename);
- } else {
- std::string filename =
- (r.filename == DEFAULT_EXECNAME_FOR_THREAD_MMAP) ? "[unknown]" : r.filename;
- thread_tree->AddThreadMap(r.data.pid, r.data.tid, r.data.addr, r.data.len, r.data.pgoff,
- r.sample_id.time_data.time, filename);
- }
- } else if (record->header.type == PERF_RECORD_COMM) {
- const CommRecord& r = *static_cast<const CommRecord*>(record.get());
- thread_tree->AddThread(r.data.pid, r.data.tid, r.comm);
- } else if (record->header.type == PERF_RECORD_FORK) {
- const ForkRecord& r = *static_cast<const ForkRecord*>(record.get());
- thread_tree->ForkThread(r.data.pid, r.data.tid, r.data.ppid, r.data.ptid);
+void BuildThreadTree(const Record& record, ThreadTree* thread_tree) {
+ if (record.header.type == PERF_RECORD_MMAP) {
+ const MmapRecord& r = *static_cast<const MmapRecord*>(&record);
+ if ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL) {
+ thread_tree->AddKernelMap(r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time,
+ r.filename);
+ } else {
+ thread_tree->AddThreadMap(r.data.pid, r.data.tid, r.data.addr, r.data.len, r.data.pgoff,
+ r.sample_id.time_data.time, r.filename);
+ }
+ } else if (record.header.type == PERF_RECORD_MMAP2) {
+ const Mmap2Record& r = *static_cast<const Mmap2Record*>(&record);
+ if ((r.header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL) {
+ thread_tree->AddKernelMap(r.data.addr, r.data.len, r.data.pgoff, r.sample_id.time_data.time,
+ r.filename);
+ } else {
+ std::string filename =
+ (r.filename == DEFAULT_EXECNAME_FOR_THREAD_MMAP) ? "[unknown]" : r.filename;
+ thread_tree->AddThreadMap(r.data.pid, r.data.tid, r.data.addr, r.data.len, r.data.pgoff,
+ r.sample_id.time_data.time, filename);
}
+ } else if (record.header.type == PERF_RECORD_COMM) {
+ const CommRecord& r = *static_cast<const CommRecord*>(&record);
+ thread_tree->AddThread(r.data.pid, r.data.tid, r.comm);
+ } else if (record.header.type == PERF_RECORD_FORK) {
+ const ForkRecord& r = *static_cast<const ForkRecord*>(&record);
+ thread_tree->ForkThread(r.data.pid, r.data.tid, r.data.ppid, r.data.ptid);
}
}