The addition of the StopCondition in the lldb_private layer meant that clearing a breakpoint condition with: sb_break.SetCondition(nullptr); now crashes. Also, GetCondition for an empty condition used to return a nullptr, but now it returns "". This patch fixes that crash and makes the SB GetCondition always return nullptr for an empty condition.
70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// Use the umbrella header for -Wdocumentation.
|
|
#include "lldb/API/LLDB.h"
|
|
|
|
#include "TestingSupport/SubsystemRAII.h"
|
|
#include "lldb/API/SBBreakpoint.h"
|
|
#include "lldb/API/SBBreakpointLocation.h"
|
|
#include "lldb/API/SBDebugger.h"
|
|
#include "lldb/API/SBTarget.h"
|
|
#include "gtest/gtest.h"
|
|
#include <memory>
|
|
#include <mutex>
|
|
|
|
using namespace lldb_private;
|
|
using namespace lldb;
|
|
|
|
class BreakpointClearConditionTest : public ::testing::Test {
|
|
public:
|
|
void SetUp() override {
|
|
m_sb_debugger = SBDebugger::Create(/*source_init_files=*/false);
|
|
};
|
|
|
|
void TearDown() override { SBDebugger::Destroy(m_sb_debugger); }
|
|
SBDebugger m_sb_debugger;
|
|
SubsystemRAII<lldb::SBDebugger> subsystems;
|
|
};
|
|
|
|
template <typename T> void test_condition(T sb_object) {
|
|
const char *in_cond_str = "Here is a condition";
|
|
sb_object.SetCondition(in_cond_str);
|
|
// Make sure we set the condition correctly:
|
|
const char *out_cond_str = sb_object.GetCondition();
|
|
EXPECT_STREQ(in_cond_str, out_cond_str);
|
|
// Now unset it by passing in nullptr and make sure that works:
|
|
const char *empty_tokens[2] = {nullptr, ""};
|
|
for (auto token : empty_tokens) {
|
|
sb_object.SetCondition(token);
|
|
out_cond_str = sb_object.GetCondition();
|
|
// And make sure an unset condition returns nullptr:
|
|
EXPECT_EQ(nullptr, out_cond_str);
|
|
}
|
|
}
|
|
|
|
TEST_F(BreakpointClearConditionTest, BreakpointClearConditionTest) {
|
|
// Create target
|
|
SBTarget sb_target;
|
|
SBError error;
|
|
sb_target =
|
|
m_sb_debugger.CreateTarget("", "x86_64-apple-macosx-", "remote-macosx",
|
|
/*add_dependent=*/false, error);
|
|
|
|
EXPECT_EQ(sb_target.IsValid(), true);
|
|
|
|
// Create breakpoint
|
|
SBBreakpoint sb_breakpoint = sb_target.BreakpointCreateByAddress(0xDEADBEEF);
|
|
test_condition(sb_breakpoint);
|
|
|
|
// Address breakpoints always have one location, so we can also use this
|
|
// to test the location:
|
|
SBBreakpointLocation sb_loc = sb_breakpoint.GetLocationAtIndex(0);
|
|
EXPECT_EQ(sb_loc.IsValid(), true);
|
|
test_condition(sb_loc);
|
|
}
|