Summary: When `module_spec.GetFileSpec().GetDirectory().AsCString()` returned a `nullptr` this line caused a segmentation fault: `std::string module_directory = module_spec.GetFileSpec().GetDirectory().AsCString()` Some context: I was remote debugging an executable built with Clang in an Ubuntu VM on my Windows machine using lldb-mi. I copied the executable and nothing else from the Ubuntu VM to the Windows machine. Then started lldb-server in the Ubuntu VM: ``` ./bin/lldb-server gdbserver *:8888 -- /home/enlight/Projects/dbgmits/build/Debug/data_tests_target ``` And ran `lldb-mi --interpreter` on Windows with the following commands: ``` -file-exec-and-symbols C:\Projects\data_tests_target -target-select remote 192.168.56.101:8888 -exec-continue ``` After which the segmentation fault occurred at the aforementioned line. Inside this method `module_spec.GetFileSpec()` returns an empty `FileSpec` (no dir, no filename), while `module_spec.GetSymbolFileSpec().GetFilename()` returns `"libc-2.19.so"`. Patch thanks to Vadim Macagon. Reviewers: brucem, zturner, clayborg Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D13201 llvm-svn: 249387
31 lines
1.1 KiB
C++
31 lines
1.1 KiB
C++
//===-- SymbolsTest.cpp -----------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "gtest/gtest.h"
|
|
#include "lldb/Host/Symbols.h"
|
|
#include "lldb/Core/ModuleSpec.h"
|
|
|
|
using namespace lldb_private;
|
|
|
|
TEST(SymbolsTest, LocateExecutableSymbolFileForUnknownExecutableAndUnknownSymbolFile)
|
|
{
|
|
ModuleSpec module_spec;
|
|
FileSpec symbol_file_spec = Symbols::LocateExecutableSymbolFile(module_spec);
|
|
EXPECT_TRUE(symbol_file_spec.GetFilename().IsEmpty());
|
|
}
|
|
|
|
TEST(SymbolsTest, LocateExecutableSymbolFileForUnknownExecutableAndMissingSymbolFile)
|
|
{
|
|
ModuleSpec module_spec;
|
|
// using a GUID here because the symbol file shouldn't actually exist on disk
|
|
module_spec.GetSymbolFileSpec().SetFile("4A524676-B24B-4F4E-968A-551D465EBAF1.so", false);
|
|
FileSpec symbol_file_spec = Symbols::LocateExecutableSymbolFile(module_spec);
|
|
EXPECT_TRUE(symbol_file_spec.GetFilename().IsEmpty());
|
|
}
|