[Lldb-commits] [PATCH] D55827: Update current working directory to avoid test crashes
Tatyana Krasnukha via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Tue Dec 18 08:06:01 PST 2018
tatyana-krasnukha created this revision.
tatyana-krasnukha added reviewers: JDevlieghere, zturner.
tatyana-krasnukha added a project: LLDB.
Herald added subscribers: lldb-commits, abidh.
Running `dotest.py` with a path to tests directory results in:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Aborted
for some tests. For example, when a test executes command "script import relative_path.py" the exception happens in ScriptInterpreterPython::LoadScriptingModule at the line
std::string directory = target_file.GetDirectory().GetCString();
because GetCString returns nullptr.
The reason of such behavior is that llvm::RealFileSystem returns cached current working directory value until it will be updated with setCurrentWorkingDirectory. So, we permanently have cwd == directory of the first test, FileSystem::Resolve doesn't find the file and just returns the original value.
P.S. What about FileSpec::GetDirectory and FileSpec::GetFileName those never return nullptr? There is a lot of code that doesn't check result on nullptr (look at llvm.org/pr37054, for example). I made a patch where these functions return empty strings instead of nullptr, but some tests fail as they expect the result is None. Other API users can be broken also.
Repository:
rLLDB LLDB
https://reviews.llvm.org/D55827
Files:
include/lldb/API/SBHostOS.h
include/lldb/Host/FileSystem.h
packages/Python/lldbsuite/test/lldbtest.py
scripts/interface/SBHostOS.i
source/API/SBHostOS.cpp
source/Host/common/FileSystem.cpp
Index: source/Host/common/FileSystem.cpp
===================================================================
--- source/Host/common/FileSystem.cpp
+++ source/Host/common/FileSystem.cpp
@@ -247,6 +247,11 @@
file_spec.SetIsResolved(true);
}
+bool FileSystem::SetCurrentWorkingDirectory(const llvm::Twine &cwd) {
+ std::error_code error = m_fs->setCurrentWorkingDirectory(cwd);
+ return !error;
+}
+
std::shared_ptr<DataBufferLLVM>
FileSystem::CreateDataBuffer(const llvm::Twine &path, uint64_t size,
uint64_t offset) {
Index: source/API/SBHostOS.cpp
===================================================================
--- source/API/SBHostOS.cpp
+++ source/API/SBHostOS.cpp
@@ -94,6 +94,10 @@
return sb_fspec;
}
+bool SBHostOS::SetCurrentWorkingDirectory(const char *cwd) {
+ return cwd ? FileSystem::Instance().SetCurrentWorkingDirectory(cwd) : false;
+}
+
lldb::thread_t SBHostOS::ThreadCreate(const char *name,
lldb::thread_func_t thread_function,
void *thread_arg, SBError *error_ptr) {
Index: scripts/interface/SBHostOS.i
===================================================================
--- scripts/interface/SBHostOS.i
+++ scripts/interface/SBHostOS.i
@@ -24,6 +24,9 @@
static lldb::SBFileSpec
GetUserHomeDirectory ();
+
+ static bool
+ SetCurrentWorkingDirectory(const char *cwd);
static void
ThreadCreated (const char *name);
Index: packages/Python/lldbsuite/test/lldbtest.py
===================================================================
--- packages/Python/lldbsuite/test/lldbtest.py
+++ packages/Python/lldbsuite/test/lldbtest.py
@@ -552,6 +552,9 @@
print("Change dir to:", full_dir, file=sys.stderr)
os.chdir(full_dir)
+ if not lldb.SBHostOS.SetCurrentWorkingDirectory(full_dir):
+ raise Exception("Failed to re-write cached cwd value.")
+
# Set platform context.
cls.platformContext = lldbplatformutil.createPlatformContext()
Index: include/lldb/Host/FileSystem.h
===================================================================
--- include/lldb/Host/FileSystem.h
+++ include/lldb/Host/FileSystem.h
@@ -130,6 +130,11 @@
void Resolve(FileSpec &file_spec);
/// @}
+ /// Set current working directory.
+ /// @{
+ bool SetCurrentWorkingDirectory(const llvm::Twine &cwd);
+ /// @}
+
//// Create memory buffer from path.
/// @{
std::shared_ptr<DataBufferLLVM> CreateDataBuffer(const llvm::Twine &path,
Index: include/lldb/API/SBHostOS.h
===================================================================
--- include/lldb/API/SBHostOS.h
+++ include/lldb/API/SBHostOS.h
@@ -25,6 +25,8 @@
static lldb::SBFileSpec GetUserHomeDirectory();
+ static bool SetCurrentWorkingDirectory(const char *cwd);
+
static void ThreadCreated(const char *name);
static lldb::thread_t ThreadCreate(const char *name,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55827.178673.patch
Type: text/x-patch
Size: 3039 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20181218/0afdca31/attachment.bin>
More information about the lldb-commits
mailing list