Colibri iMX6 512MB IT
Colibri Evaluation Board
Often when I am running my programs through the debugger it is very slow, and the terminal falls behind (I am outputting a lot of printf statements as I am debugging)
So I often open a terminal, cd to my home directory in /home/torizon and run my program from there, because it is faster:
I don’t know if this is best practice or not, I guess its not running inside a docker container when I do this, right? What sort of command would you run if you wanted to run your container “properly” from the command line?
I see that there is an image when I do a
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
emerablockenergybox_arm32v7-debian-no-ssh_bullseye_debug_69ac5093-51e4-4f03-8827-ec9f9390dfe3 latest 107484988768 2 hours ago 96.9MB
canhandler_arm32v7-debian-python3_bullseye_debug_b2997fdb-bcc2-4014-bc57-bc1847a3025c latest 6d2a2866eaef 4 hours ago 147MB
can-torizon-sample latest 98ffb8c77234 3 days ago 164MB
torizon/weston 2 33c0dabf2801 7 weeks ago 305MB
torizon/kiosk-mode-browser 2 31de96a2ab85 5 months ago 510MB
torizon/kiosk-mode-browser 2.5.0-20211122 31de96a2ab85 5 months ago 510MB
torizon/weston <none> a0250110091f 5 months ago 305MB
portainer/portainer-ce 2.9.3 49a6a4ef6f63 5 months ago 216MB
docker run emerablockenergybox_arm32v7-debian-no-ssh_bullseye_debug_69ac5093-51e4-4f03-8827-ec9f9390dfe3
but I get:
gdbserver: Error disabling address space randomization: Success
/bin/sh: 1: exec: /EmeraBlockEnergyBox/EmeraBlockEnergyBox: not found
During startup program exited with code 127.
But I can see the file is there:
What am I missing? (don’t say “a brain”)
It looks like you created this container with our VSCode extensions, is that correct?
If that is the case then the extension should be able to produce the corresponding
docker run command based off your project configurations.
Just go to your project for this app and press
F1, then run
Torizon: docker command line. This should produce arguments equivalent to what the extension does when it executes your container.
This is very useful! Thanks.
So, follow up questions abound then…
When I run this on my command line I get
colibri-imx6-10866289:~$ docker run --network 'host' --volume /dev:/dev --volume /home/torizon/logs:/home/torizon/logs --volume /run/udev:/run/udev --volume /tmp:/tmp --volume ContainerVolume:/NewVolume --volume /home/torizon/EmeraBlockEnergyBox:/EmeraBlockEnergyBox:rw --device /dev/spidev3.0:/dev/spidev3.0 --device /dev/colibri-i2c:/dev/colibri-i2c --publish :6502/tcp emerablockenergybox_arm32v7-debian-no-ssh_bullseye_debug_69ac5093-51e4-4f03-8827-ec9f9390dfe3
WARNING: Published ports are discarded when using host network mode
gdbserver: Error disabling address space randomization: Success
Process /EmeraBlockEnergyBox/EmeraBlockEnergyBox created; pid = 10
Listening on port 6502
and there is no output, nor does the program allow me to exit
In what ways can I manage to produce an output (I am using printf at the moment) or stop the program? Is there a torizon tutorial about this sort of thing which I may have missed?
As I said in your other post: Python command "import can" ModuleNotFoundError - #6 by jeremias.tx
You should probably be running the release version of the container rather than the debug version. Also it’d be helpful if you could keep this conversation to just one of these posts so that we stop hopping back and forth like this.
The debug container you’re running here is well designed for remote debugging with VSCode. Invoking it starts your application but also the debugger. If you just want to run your application like how it would run in a production setting then you want to use the “release” variant which just has your application and no debugger. In the extension you should be able to build and deploy the release variant of your application.
I see that now,
but I still don’t see how to get printf statements to appear, or how to stop the program when running in release mode (assuming these printf statements are not strictly for debugging purposes)
We can keep this docker-related discussion in this question, of course.
If you’re directly printing to stdout then the output should appear in that container’s logs. If you’re running the container detached in the background.
To stop the container, it depends if you’re running the container detached in the background or not. If you are then you can use
docker stop otherwise you’ll have to interrupt the console with a usual ctrl + c.
How do I know if I am running detached in the background or not.
I am just using the Torizon command “export docker command line”
docker run --network ‘host’ --volume /dev:/dev --volume /home/torizon/logs:/home/torizon/logs --volume /run/udev:/run/udev --volume /tmp:/tmp --volume ContainerVolume:/NewVolume --volume /home/torizon/EmeraBlockEnergyBox:/EmeraBlockEnergyBox:rw --device /dev/spidev3.0:/dev/spidev3.0 --device /dev/colibri-i2c:/dev/colibri-i2c --publish :6502/tcp --publish 8080:8080/tcp emerablockenergybox_arm32v7-debian-no-ssh_bullseye_debug_69ac5093-51e4-4f03-8827-ec9f9390dfe3
I don’t know if printf is going to stdout (I assume it does, since I didn’t knowingly pipe it to anything else?) So you’re saying there are logs somewhere I should read? NO OUTPUT TO SCREEN?
So to stop, I would need to open another shell to the board, and look at the running docker processes and do a docker stop from there?
How are you starting your container? Are you having VSCode execute things? Or are you manually running this
docker run... command yourself?
If VSCode is the one executing things then the application container should be running in the background being executed as a background process. If you are manually executing you need to add the detached flag as per the Docker documentation: Docker run reference | Docker Documentation
If a container is running in the background then it’s stdout can be viewed via
docker logs: docker logs | Docker Documentation
As a simple example of all this just create a fresh new C/C++ project in VSCode. This generates a basic “Hello World” application. It prints “Hello World” to stdout which can be seen in that container’s logs via the method I described above.
If you don’t see your
printf messages then it must not be going to stdout.
Okay, now I have learned that to run things in the most useful way (for me) is to run the container in the following way… I hope this helps anyone who may stumble into this post, and wants to run your program from your container’s CLI directly from linux.
F1 → Torizon: build release container for the application
F1 → Torizon: deploy release container (make sure no running containers already exist with that image on the target, or it doesn’t work)
F1 → Torizon: export docker command line
copy and paste the docker run… command (look in OUTPUT window) to a notepad, and manually add the “-it --privileged” near the beginning, and the “bash” at the end.
docker run -it --privileged --network ‘host’ --volume /dev:/dev --volume /etc/adjtime:/etc/adjtime --volume /etc/localtime:/etc/localtime --volume /etc/timezone:/etc/timezone --volume /home/torizon/config:/home/torizon/config --volume /home/torizon/logs:/home/torizon/logs --volume /run/udev:/run/udev --volume /tmp:/tmp --volume /usr/share/zoneinfo:/usr/share/zoneinfo --volume ContainerVolume:/NewVolume --device /dev/spidev3.0:/dev/spidev3.0 --device /dev/colibri-i2c:/dev/colibri-i2c --device /dev/gpiochip0:/dev/gpiochip0 --device /dev/gpiochip1:/dev/gpiochip1 --device /dev/gpiochip2:/dev/gpiochip2 --device /dev/gpiochip3:/dev/gpiochip3 --device /dev/spidev3.1:/dev/spidev3.1 --publish 8080:8080/tcp emerablockenergybox_arm32v7-debian-no-ssh_bullseye_release_69ac5093-51e4-4f03-8827-ec9f9390dfe3 bash
on the TARGET:
paste the docker run command and press enter.
Now you will get a new command prompt: Now you are in the CONTAINER’S CLI
from here, you can type the exectutable name:
and it will run with the printf messages as expected.
you can even press CTRL-C and it stays in the CLI.
you can also see what files you have access to.
Remember that ~ may not bring you to /home/torizon anymore, so you might need to cd there manually…
To summarize this post, the easiest way to do what I needed
after running the program (from the VSCODE, or whatever) you can first do a
to find out your [container ID]. After that, there are three options.
$ docker attach [container ID]
The above lets you see the stdout of your program. You can’t easily break it or kill it from the terminal though…
$ docker logs --follow [container ID]
which looks the same as above, but you can break it.