Here's a simple C++ program that echoes its arguments...
#include <stdio.h>
int main(int argc, char* argv[])
{
for (int i=0; i<argc; ++i) printf("%d %s\n", i, argv[i]);
}
This works as expected...
> ./test arg1 #arg2 arg3
0 ./test
1 arg1
2 #arg2
3 arg3
Running under lldb gives this...
> lldb ./test arg1 #arg2 arg3
(lldb) target create "./test"
Current executable set to '/Users/richard/Work/test' (arm64).
(lldb) settings set -- target.run-args "arg1" "#arg2" "arg3"
(lldb) run
Process 6138 launched: '/Users/richard/Work/test' (arm64)
0 /Users/richard/Work/test
1 arg1
Process 6138 exited with status = 0 (0x00000000)
I get the same if I quote the arguments, or if I add them to the run line. Stepping into main()
we see the argv
and args
values are as though we only had the first argument. If I quote the second argument and add an initial space " #arg1"
then it works.
I first saw this on an M1 running Sequoia 13.1. It am now on OS 13.3.
lldb --version
lldb-1600.0.39.109
Apple Swift version 6.0.3 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
I generally run a command with arguments using r
:
% lldb Test773781
(lldb) target create "Test773781"
;
(lldb) r arg1 #arg2 arg3
;
0 …/Test773781
1 arg1
The interesting thing here is that LLDB has the right arguments:
(lldb) settings show target.run-args
target.run-args (arguments) =
[0]: "arg1"
[1]: "#arg2"
[2]: "arg3"
It’s just not applying them at launch.
Notably, the r
command is an alias for process launch
:
(lldb) help r
Launch the executable in the debugger.
Syntax: r [<run-args>]
r [<run-args>]
'r' is an abbreviation for 'process launch -X true --'
Note that -X
option. Its long name is --shell-expand-args
. If you set it to false
, it resolves this issue:
(lldb) process launch -X false
…
0 …/Test773781
1 arg1
2 #arg2
3 arg3
So it seems that LLDB’s shell-like argument expansion is interpreting the #
as a comment. Fun times!
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"