This is part 2 of our series entitled "ROS people don't know how to use computers". This is about ROS1. ROS2 is presumably broken in some completely different way, but I don't know.
Unlike normal people, the ROS people don't "run" applications. They "launch" "nodes" from "packages" (these are "ROS" packages; obviously). You run
roslaunch PACKAGE THING.launch
Then it tries to find this PACKAGE
(using some rules that nobody understands),
and tries to find the file THING.launch
within this package. The .launch
file contains inscrutable xml, which includes other inscrutable xml. And
if you dig, you eventually find stuff like
<node pkg="PACKAGE" name="NAME" type="TYPE" args="...." ...>
This defines the thing that runs. Unexpectedly, the executable that ends up
running is called TYPE
.
I know that my particular program is broken, and needs an LD_PRELOAD
(exciting
details described in another rant in the near future). But the above definition
doesn't have a clear way to add that. Adding it to the type
fails (with a very
mysterious error message). Reading the docs tells you about launch-prefix
,
which sounds exactly like what I want. But when I add
LD_PRELOAD=/tmp/whatever.so
I get
RLException: Roslaunch got a 'No such file or directory' error while attempting to run: LD_PRELOAD=/tmp/whatever.so ..../TYPE .....
But this is how you're supposed to be attaching gdb and such! Presumably it looks at the first token, and makes sure it's a file, instead of simply prepending it to the string it passes to the shell. So your options are:
- Do only approved ROS things in the docs (which are limited, since the docs were written by people who don't know how to use computers)
- Be expert-enough to work around it
I'm expert-enough. You do this:
launch-prefix="/lib64/ld-linux-x86-64.so.2 --preload /tmp/whatever.so"