#include <babeltrace/crc32.h>
#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/utils.h>
+#include <errno.h>
/*
* An address printed in hex is at most 20 bytes (16 for 64-bits +
*
* @param bin bin_info instance for which to set DWARF info
* @param path Presumed location of the DWARF info
- * @returns 0 on success, -1 on failure
+ * @returns 0 on success, negative value on failure
*/
static
int bin_info_set_dwarf_info_from_path(struct bin_info *bin, char *path)
fd = open(path, O_RDONLY);
if (fd < 0) {
+ fd = -errno;
goto error;
}
return 0;
error:
- close(fd);
+ if (fd >= 0) {
+ close(fd);
+ fd = -1;
+ }
dwarf_end(dwarf_info);
g_free(dwarf_info);
free(cu);
- return -1;
+ return fd;
}
/**
uint32_t _crc = 0;
if (!path) {
- goto end;
+ goto end_noclose;
}
fd = open(path, O_RDONLY);
if (fd < 0) {
- goto end;
+ goto end_noclose;
}
ret = crc32(fd, &_crc);
end:
close(fd);
+end_noclose:
return ret;
}
* Initialize the DWARF info for a given executable.
*
* @param bin bin_info instance
- * @returns 0 on success, -1 on failure
+ * @returns 0 on success, negative value on failure
*/
static
int bin_info_set_dwarf_info(struct bin_info *bin)
int ret = 0;
if (!bin) {
- goto error;
+ ret = -1;
+ goto end;
}
/* First try to set the DWARF info from the ELF file */
goto end;
}
-error:
- ret = -1;
end:
return ret;
}
* Initialize the ELF file for a given executable.
*
* @param bin bin_info instance
- * @returns 0 on success, -1 on failure
+ * @returns 0 on success, negative value on error.
*/
static
int bin_info_set_elf_file(struct bin_info *bin)
elf_fd = open(bin->elf_path, O_RDONLY);
if (elf_fd < 0) {
+ elf_fd = -errno;
printf_verbose("Failed to open %s\n", bin->elf_path);
goto error;
}
error:
if (elf_fd >= 0) {
close(elf_fd);
+ elf_fd = -1;
}
elf_end(elf_file);
- return -1;
+ return elf_fd;
}
BT_HIDDEN
error:
g_free(shdr);
g_free(sym);
- return -1;
+ return ret;
}
/**
ret = dwarf_lowpc(die->dwarf_die, &low_addr);
if (ret) {
+ free(die_name);
goto error;
}
ret = bin_info_append_offset_str(die_name, low_addr, addr,
func_name);
+ free(die_name);
if (ret) {
goto error;
}
if (!bin->dwarf_info && !bin->is_elf_only) {
ret = bin_info_set_dwarf_info(bin);
if (ret) {
+ printf_verbose("Failed to set bin dwarf info, falling back to ELF lookup.\n");
/* Failed to set DWARF info, fallback to ELF. */
bin->is_elf_only = true;
}
if (bin->is_elf_only) {
ret = bin_info_lookup_elf_function_name(bin, addr, &_func_name);
+ printf_verbose("Failed to lookup function name (elf), error %i\n", ret);
} else {
ret = bin_info_lookup_dwarf_function_name(bin, addr, &_func_name);
- }
-
- if (ret || !_func_name) {
- goto error;
+ printf_verbose("Failed to lookup function name (dwarf), error %i\n", ret);
}
*func_name = _func_name;
goto error;
}
- if (contains) {
+ if (_contains) {
goto end;
}
}