Linux symbol file dumping
This commit is contained in:
parent
b8548750b6
commit
3dc66eec46
@ -11,23 +11,48 @@ def BuildEverything():
|
|||||||
|
|
||||||
compiler = SM.DefaultCompiler()
|
compiler = SM.DefaultCompiler()
|
||||||
|
|
||||||
compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src'))
|
|
||||||
|
|
||||||
if AMBuild.target['platform'] in ['linux']:
|
if AMBuild.target['platform'] in ['linux']:
|
||||||
|
compiler['POSTLINKFLAGS'].append('-lm')
|
||||||
compiler['POSTLINKFLAGS'].append('-lstdc++')
|
compiler['POSTLINKFLAGS'].append('-lstdc++')
|
||||||
compiler['POSTLINKFLAGS'].append('-pthread')
|
compiler['POSTLINKFLAGS'].append('-pthread')
|
||||||
|
|
||||||
|
compiler['CDEFINES'].append('HAVE_CONFIG_H')
|
||||||
|
compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'breakpad', 'build', 'src'))
|
||||||
elif compiler.cc.name == 'msvc':
|
elif compiler.cc.name == 'msvc':
|
||||||
compiler['POSTLINKFLAGS'].remove('/SUBSYSTEM:WINDOWS')
|
compiler['POSTLINKFLAGS'].remove('/SUBSYSTEM:WINDOWS')
|
||||||
compiler['POSTLINKFLAGS'].append('/SUBSYSTEM:CONSOLE')
|
compiler['POSTLINKFLAGS'].append('/SUBSYSTEM:CONSOLE')
|
||||||
|
|
||||||
|
compiler['CXXINCLUDES'].append(os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src'))
|
||||||
|
|
||||||
name = 'test-crash-dump-generation'
|
name = 'test-crash-dump-generation'
|
||||||
extension = AMBuild.AddJob(name)
|
extension = AMBuild.AddJob(name)
|
||||||
binary = Cpp.ExecutableBuilder(name, AMBuild, extension, compiler)
|
binary = Cpp.ExecutableBuilder(name, AMBuild, extension, compiler)
|
||||||
|
|
||||||
binary.AddSourceFiles('test', [
|
sourceFiles = [
|
||||||
'test.cpp',
|
'test.cpp',
|
||||||
|
]
|
||||||
|
|
||||||
|
if AMBuild.target['platform'] in ['linux']:
|
||||||
|
sourceFiles.extend([
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'dwarf_cfi_to_module.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'dwarf_cu_to_module.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'dwarf_line_to_module.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'language.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'module.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'path_helper.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'stabs_reader.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'stabs_to_module.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'dwarf', 'bytereader.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'dwarf', 'dwarf2diehandler.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'dwarf', 'dwarf2reader.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'dwarf', 'elf_reader.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'linux', 'crc32.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'linux', 'dump_symbols.cc'),
|
||||||
|
os.path.join(AMBuild.sourceFolder, 'breakpad', 'src', 'src', 'common', 'linux', 'elf_symbols_to_module.cc'),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
binary.AddSourceFiles('test', sourceFiles);
|
||||||
|
|
||||||
if AMBuild.target['platform'] in ['linux']:
|
if AMBuild.target['platform'] in ['linux']:
|
||||||
libs = [
|
libs = [
|
||||||
('libbreakpad_client.a', os.path.join('breakpad', 'build', 'src', 'client', 'linux', 'libbreakpad_client.a')),
|
('libbreakpad_client.a', os.path.join('breakpad', 'build', 'src', 'client', 'linux', 'libbreakpad_client.a')),
|
||||||
|
@ -2,16 +2,22 @@
|
|||||||
#include "client/linux/handler/exception_handler.h"
|
#include "client/linux/handler/exception_handler.h"
|
||||||
#include "common/linux/linux_libc_support.h"
|
#include "common/linux/linux_libc_support.h"
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
#include "third_party/lss/linux_syscall_support.h"
|
||||||
|
#include "common/linux/dump_symbols.h"
|
||||||
|
#include "common/path_helper.h"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <paths.h>
|
||||||
|
|
||||||
#define my_jmp_buf sigjmp_buf
|
#define my_jmp_buf sigjmp_buf
|
||||||
#define my_setjmp(x) sigsetjmp(x, 0)
|
#define my_setjmp(x) sigsetjmp(x, 0)
|
||||||
#define my_longjmp siglongjmp
|
#define my_longjmp siglongjmp
|
||||||
|
|
||||||
using google_breakpad::MinidumpDescriptor;
|
using google_breakpad::MinidumpDescriptor;
|
||||||
|
using google_breakpad::WriteSymbolFile;
|
||||||
|
|
||||||
#elif defined _WINDOWS
|
#elif defined _WINDOWS
|
||||||
#define _STDINT // ~.~
|
#define _STDINT // ~.~
|
||||||
@ -174,6 +180,54 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
|
#if defined _LINUX
|
||||||
|
for (unsigned int moduleIndex = 0; moduleIndex < moduleCount; ++moduleIndex) {
|
||||||
|
auto module = processState.modules()->GetModuleAtIndex(moduleIndex);
|
||||||
|
|
||||||
|
auto debugFile = module->debug_file();
|
||||||
|
if (debugFile[0] != '/') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s\n", debugFile.c_str());
|
||||||
|
|
||||||
|
auto debugFileDir = google_breakpad::DirName(debugFile);
|
||||||
|
std::vector<string> debug_dirs{
|
||||||
|
debugFileDir,
|
||||||
|
};
|
||||||
|
|
||||||
|
FILE *saved_stderr = fdopen(dup(fileno(stderr)), "w");
|
||||||
|
if (freopen(_PATH_DEVNULL, "w", stderr)) {
|
||||||
|
// If it fails, not a lot we can (or should) do.
|
||||||
|
// Add this brace section to silence gcc warnings.
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ostringstream outputStream;
|
||||||
|
google_breakpad::DumpOptions options(ALL_SYMBOL_DATA, true);
|
||||||
|
if (!WriteSymbolFile(debugFile, debug_dirs, options, outputStream)) {
|
||||||
|
outputStream.str("");
|
||||||
|
outputStream.clear();
|
||||||
|
|
||||||
|
// Try again without debug dirs.
|
||||||
|
if (!WriteSymbolFile(debugFile, {}, options, outputStream)) {
|
||||||
|
// TODO: Something.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fflush(stderr);
|
||||||
|
dup2(fileno(saved_stderr), fileno(stderr));
|
||||||
|
fclose(saved_stderr);
|
||||||
|
|
||||||
|
|
||||||
|
// WriteSymbolFileHeaderOnly would do this for us, but this is just for testing.
|
||||||
|
auto output = outputStream.str();
|
||||||
|
output = output.substr(0, output.find("\n"));
|
||||||
|
fprintf(stdout, "%s\n", output.c_str());
|
||||||
|
|
||||||
|
// break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (generateCrash) {
|
if (generateCrash) {
|
||||||
|
Loading…
Reference in New Issue
Block a user