in src/windows/pdb.rs [229:321]
fn check_func(
pos: usize,
new: &BreakpadFuncRecord,
old: &BreakpadFuncRecord,
file_map_new: &BreakpadFileMap,
file_map_old: &BreakpadFileMap,
flags: &TestFlags,
) {
assert_eq!(
new.address,
old.address,
"Not the same address for FUNC at position {}",
pos + 1
);
if !flags.intersects(TestFlags::NO_MULTIPLICITY) {
assert_eq!(
new.multiple, old.multiple,
"Not the same multiplicity for FUNC at rva {:x}",
new.address
);
}
assert_eq!(
new.size, old.size,
"Not the same size for FUNC at rva {:x}",
new.address
);
assert_eq!(
new.parameter_size, old.parameter_size,
"Not the same parameter size for FUNC at rva {:x}",
new.address
);
assert_eq!(
new.name, old.name,
"Not the same name for FUNC at rva {:x}",
new.address
);
let line_old = clean_old_lines(old);
let line_new = new.lines();
assert_eq!(
line_new.clone().count(),
line_old.len(),
"Not the same number of lines for FUNC at rva {:x}",
new.address
);
for (i, (line_n, line_o)) in line_new.zip(line_old.iter()).enumerate() {
let line_n = line_n.unwrap();
assert_eq!(
line_n.address,
line_o.address,
"Not the same address for line at position {} in FUNC at rva {:x}",
i + 1,
new.address
);
if flags.intersects(TestFlags::NO_FILE_LINE) {
continue;
}
if i < line_old.len() - 1 {
// Sometimes the last line is different
// For a line, DIA seems to compute the length using the address of next line minus address of the line
// But it appears that in assembly files we may have several symbols for the same offset
// and so the length may be incorrect.
assert_eq!(
line_n.size,
line_o.size,
"Not the same size for line at position {} in FUNC at rva {:x}",
i + 1,
new.address
);
}
assert_eq!(
line_n.line,
line_o.line,
"Not the same line number for line at position {} in FUNC at rva {:x}",
i + 1,
new.address
);
assert_eq!(
file_map_new.get(&line_n.file_id),
file_map_old.get(&line_o.file_id),
"Not the same file for line at position {} in FUNC at rva {:x}",
i + 1,
new.address
);
}
}