// Define the first (and only) variant of this arg.
value_arg.arg_type = eArgTypeValue;
value_arg.arg_repetition = eArgRepeatPlus;
+ value_arg.arg_opt_set_association = LLDB_OPT_SET_1;
// There is only one variant this argument could be; put it into the
// argument entry.
m_cmd_name.c_str());
return false;
}
+ if (argc > 1) {
+ result.AppendErrorWithFormat(
+ "%s takes only a destination address when writing file contents.\n",
+ m_cmd_name.c_str());
+ return false;
+ }
} else if (argc < 2) {
result.AppendErrorWithFormat(
"%s takes a destination address and at least one value.\n",
--- /dev/null
+"""
+Test the 'memory write' command.
+"""
+
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+
+
+class MemoryWriteTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.c', '// Set break point at this line.')
+
+ def build_run_stop(self):
+ self.build()
+ exe = self.getBuildArtifact("a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break in main() after the variables are assigned values.
+ lldbutil.run_break_set_by_file_and_line(self,
+ "main.c",
+ self.line,
+ num_expected_locations=1,
+ loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list",
+ STOPPED_DUE_TO_BREAKPOINT,
+ substrs=['stopped', 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ lldbutil.check_breakpoint(self, bpno = 1, expected_hit_count = 1)
+
+ @no_debug_info_test
+ def test_memory_write(self):
+ """Test the 'memory write' command for writing values and file contents."""
+ self.build_run_stop()
+
+ self.expect(
+ "memory read --format c --size 7 --count 1 `&my_string`",
+ substrs=['abcdefg'])
+
+ self.expect(
+ "memory write --format c --size 7 `&my_string` ABCDEFG")
+
+ self.expect(
+ "memory read --format c --size 7 --count 1 `&my_string`",
+ substrs=['ABCDEFG'])
+
+ self.expect(
+ "memory write --infile file.txt --size 7 `&my_string`",
+ substrs=['7 bytes were written'])
+
+ self.expect(
+ "memory read --format c --size 7 --count 1 `&my_string`",
+ substrs=['abcdefg'])
+
+ self.expect(
+ "memory write --infile file.txt --size 7 `&my_string` ABCDEFG", error=True,
+ substrs=['error: memory write takes only a destination address when writing file contents'])
+
+ self.expect(
+ "memory write --infile file.txt --size 7", error=True,
+ substrs=['error: memory write takes a destination address when writing file contents'])
+
+ @no_debug_info_test
+ def test_memory_write_command_usage_syntax(self):
+ """Test that 'memory write' command usage syntax shows it does not take values when writing file contents."""
+ self.expect(
+ "help memory write",
+ substrs=[
+ "memory write [-f <format>] [-s <byte-size>] <address> <value> [<value> [...]]",
+ "memory write -i <filename> [-s <byte-size>] [-o <offset>] <address>"])