Armadilloフォーラム

c言語による開発においてprintfによる出力をVSCodeのターミナル上に出力する方法

k-sawamura

2025年2月26日 10時24分

お世話になっております。

c言語アプリの開発で、デバッグ用にprintfによる出力をVSCodeのターミナル上に出力する方法を教えてください。

以下はFlutterアプリについての記事ですが、c言語についても言及があったため参考にしようとしましたが、
[Debug run on Armadillo]の実行方法がわからず再現できませんでした。
https://armadillo.atmark-techno.com/forum/armadillo/21772

app.confには以下の設定を追加しています。他に設定や手順で必要なものがあればご教示願います。
add_devices /dev/ttymxc2
set_command sh -c '/vol_app/build/main > /dev/ttymxc2'

コメント

at_satoshi.ohta

2025年2月26日 11時22分

太田です。

VS code 上のターミナルに出力するのであれば、add_devices などの設定は特に必要なく、[App run on armadillo] を実行していただければ printf の内容は表示されます。

[App run on Armadillo] を実行すると、'./scripts/run_armadillo.sh' が実行されます。
run_armadillo.sh では、C 言語プロジェクトの場合、

- make して実行ファイルを作成し直す
- app/build と app/lib ディレクトリと app.conf を Armadillo 内にコピーする
- Armadillo 内で podman_start および podman attach を実行

podman_start は/etc/atmark/containers/<プロジェクト名>.conf を読み込み、その設定でコンテナを起動するコマンドです。
podman attach は実行中のコンテナに接続し、進行中の出力を表示したり出来ます。

また、[App run on Armadillo] を実行するには、cofig/ssh_config の 「Hostname x.x.x.x」の x.x.x.x を Armadillo の IP アドレスに書き換える必要があります。

どうぞよろしくお願いいたします。

回答ありがとうございます。
> VS code 上のターミナルに出力するのであれば、add_devices などの設定は特に必要なく、[App run on armadillo] を実行していただければ printf の内容は表示されます。

[App run on Armadillo]は実行できています。
そのうえでVSCodeのターミナルにprintf()の結果が表示されない状況です(perror()は出力されますができればprintf()を使いたい)。
先に添付している記事から、[Debug run on Armadillo]という別モードがあるのかと思いましたが、違うということでしょうか。

at_satoshi.ohta

2025年2月26日 13時52分

太田です。

[Debug run on Armadillo] は flutter系のプロジェクトであり、C 言語プロジェクトには存在しません。

[App run on Armadillo] においても、添付した画像のように printf()の出力結果が表示されます。
画像では、LED を点灯させるサンプルプログラムの main.c に printf("this is an output from printf()\n"); を追記した後、[App run on Armadillo] を実行しています。
ターミナル上でも "this is an output from printf()" が表示されています。

原因を検討するために、[App run on Armadillo] 実行時に VS Code 上のターミナルに表示されるログを添付いただければ幸いです。

また、原因を切り分けるためにお手数ですが、ABOSDE を最新にした上で、新しい C 言語プロジェクトを作成して、同様にサンプルプログラムを用いた場合に問題なく printf() の出力が VS Code 上に表示されるか試していただけますでしょうか?

どうぞよろしくお願いいたします。

ファイル ファイルの説明
example_printf_app_run_on_armadillo.png

at_satoshi.ohta

2025年2月26日 14時05分

太田です。

立て続けに申し訳ありません。

app.confの以下の設定を行っている場合は、

add_devices /dev/ttymxc2
set_command sh -c '/vol_app/build/main > /dev/ttymxc2'

set_command sh -c '/vol_app/build/main'

にして実行してみてはいただけますでしょうか?

よろしくお願いいたします。

回答ありがとうございます
> また、原因を切り分けるためにお手数ですが、ABOSDE を最新にした上で、新しい C 言語プロジェクトを作成して、同様にサンプルプログラムを用いた場合に問題なく printf() の出力が VS Code 上に表示されるか試していただけますでしょうか?
>
ご提案いただいた通り、新たにCのプロジェクトを作成し、printfの構文を足してみましたが、依然出力されない状態です(ソースコード及びコンテナログ.jpg)。
更に今回はperrorも出なくなりました。コンテナのログには出ているので、動いてはいると思うのですが。
app.confには変更を加えていません。
お手数をおかけしますが、ご確認お願い致します。

環境に関する補足ですが
開発環境の関係上、有線LANによる接続ではなくwifi経由でPCとArmadilloを接続しております。
もし、上記環境で動作に影響があるのであれば教えていただきたいです。

ファイル ファイルの説明
ソースコード及びコンテナログ.jpg

at_satoshi.ohta

2025年2月27日 15時46分

太田です。

最新の C 言語プロジェクトをダウンロードして試して頂きありがとうございます。
C 言語プロジェクトを改めて作成し、修正した内容は main.c に printf() と perror() を追加しただけにも関わらず printf() も perror() も表示されないのですね...

以下、試していただけますでしょうか?

1. 関係ないとは思いますが、ABOS と ABOSDE のバージョンを最新にして頂いてもよろしいでしょうか?
- ABOS は以下のURLの「Armadillo-IoT ゲートウェイA6E用 SWUイメージファイル」から SWU イメージをダウンロードできます。
https://armadillo.atmark-techno.com/resources/software/armadillo-iot-a6…
- ABOSDE は VS Code の「拡張機能」の検索で「ABOSDE」を入力していただければ、「Armadillo Base OS Development Environtmet」を見つけることができます。バージョンが古ければ「Update」と表示されるはずです。

2. ABOS Web で Armadillo にアクセスしていない状態(ABOS Web をログアウトした状態)で [App run on Armadillo] を行うとどうなりますでしょうか?
ABOS Web 側では、podman logs コマンドを実行していて、 [App run on Armadillo] 側では podman attach をしていることでなにかしら不具合が生じていることを懸念しています。

3. [App run on Armadillo] は最終的には以下のコマンドを実行しています。

ssh -F config/ssh_config Armadillo "podman_start $container && podman attach $container"

Armadillo のターミナルに入って頂き、直接以下のコマンドを実行すると Armadillo のターミナル上にログは表示されるでしょうか?

podman_start <プロジェクト名> && podman attach <プロジェクト名>

もし、表示されるならば、ATDE のC 言語のプロジェクトディレクトリ下で以下のコマンドを実行するとどうなりますでしょうか?

atmark@atde9:~/<プロジェクト名>$ ssh -F config/ssh_config Armadillo "podman_start <プロジェクト名> && podman attach <プロジェクト名>"

4. 有線LAN と wifi での通信方法で変わるとは思えませんが、有線 LAN を使用してみるとどうなるでしょうか?

手探りで申し訳ありません。
どうぞよろしくお願いいたします。

回答ありがとうございます。
示していただいた案の④以外試してみましたが、出力されない状況は変わりませんでした。他に試せることはあるでしょうか。

以下は試した結果になります。

> 1. 関係ないとは思いますが、ABOS と ABOSDE のバージョンを最新にして頂いてもよろしいでしょうか?
ABOSのアップデート自体は行われたようですが、動作に変化はありませんでした。
ABOSDEは最新版でした。
base_os: 3.20.5-at.8 -> 3.21.3-at.1

> 2. ABOS Web で Armadillo にアクセスしていない状態(ABOS Web をログアウトした状態)で [App run on Armadillo] を行うとどうなりますでしょうか?
ABOS Webは起動せず[App run on Armadillo] を実行しましたが、やはりターミナルへの出力はありませんでした。

> 3. [App run on Armadillo] は最終的には以下のコマンドを実行しています。Armadillo のターミナルに入って頂き、直接以下のコマンドを実行すると Armadillo のターミナル上にログは表示されるでしょうか?
TeraTermからコマンド実行を行いましたが、出力されませんでした。(コマンド実行結果.jpg)

> 4. 有線LAN と wifi での通信方法で変わるとは思えませんが、有線 LAN を使用してみるとどうなるでしょうか?
こちらの環境の都合でこの案は実施できておりません。

ファイル ファイルの説明
コマンド実行結果.jpg

at_satoshi.ohta

2025年3月3日 10時43分

太田です。

1 ~ 3 を試して頂きありがとうございます。
3 の結果から、そもそも Armadillo 上でコンテナを起動した時点で出力されないことが分かりました。

以下のようにコンテナの中に入って頂き、c_launch を実行すると出力されますでしょうか?

armadillo:~# podman exec -it printfset /bin/bash  # コンテナの中に入ります
root@9251b1ebcebe:/# c_launch

また、一応以下のコマンドを実行して c_launch の中身の内容も確認したいので出力結果を送っていただけると幸いです。

root@9251b1ebcebe:/# cat /bin/c_launch

お手数をおかけして申し訳ありませんが、試していただけると幸いです。
どうぞよろしくお願いたします。

回答ありがとうございます。
> 太田です。
>
> 1 ~ 3 を試して頂きありがとうございます。
> 3 の結果から、そもそも Armadillo 上でコンテナを起動した時点で出力されないことが分かりました。
>
> 以下のようにコンテナの中に入って頂き、c_launch を実行すると出力されますでしょうか?
>

> armadillo:~# podman exec -it printfset /bin/bash  # コンテナの中に入ります
> root@9251b1ebcebe:/# c_launch
> 

> また、一応以下のコマンドを実行して c_launch の中身の内容も確認したいので出力結果を送っていただけると幸いです。
>

> root@9251b1ebcebe:/# cat /bin/c_launch
> 

> お手数をおかけして申し訳ありませんが、試していただけると幸いです。
> どうぞよろしくお願いたします。

提示していただいたコマンドを実行したところ、printf,perrorの内容共に出力されました。
cat /bin/c_launchの実行結果もあわせて、以下の状態です。
お手数をおかけしますが、ご確認お願い致します。

▼実行結果
armadillo:~# podman exec -it printfset /bin/bash
root@9ff546abc910:/# c_launch
this is an output from printf()
perror: Success
^C
root@9ff546abc910:/# cat /bin/c_launch
#!/bin/sh

exec /vol_app/build/main

at_satoshi.ohta

2025年3月3日 16時02分

太田です。

コンテナの中では出力されるということで了解しました。
podman_start と podman attach 実行時にラグがあり、出力されていない可能性も考えられると思います。
以下のように ATDE の C 言語のサンプルプログラムの printfset/app/src/blink.c にある blink 関数内に printf() を追加して [App run on Armadillo] を実行して VS Code のターミナル上に出力されるか試してみていただけますでしょうか?

app/blink.c に★の部分を追記してください。
 
...省略
    i = 0;  ★
    while(1) {
        printf("%d: bink()\n", i);  ★
        i++;  ★
        if ((result = change_brightness(fp, '0')) != 0) {
            break;
        }
...省略

どうぞよろしくお願いいたします。

回答ありがとうございます。
> コンテナの中では出力されるということで了解しました。
> podman_start と podman attach 実行時にラグがあり、出力されていない可能性も考えられると思います。
> 以下のように ATDE の C 言語のサンプルプログラムの printfset/app/src/blink.c にある blink 関数内に printf() を追加して [App run on Armadillo] を実行して VS Code のターミナル上に出力されるか試してみていただけますでしょうか?
>

> app/blink.c に★の部分を追記してください。
> 
> ...省略
>     i = 0;  ★
>     while(1) {
>         printf("%d: bink()\n", i);  ★
>         i++;  ★
>         if ((result = change_brightness(fp, '0')) != 0) {
>             break;
>         }
> ...省略
> 

>
> どうぞよろしくお願いいたします。
提案いただいたものを実行しました。
0から出力されるのが期待値と思われますが、1から出力されました(実施結果.jpg)
仰られている時間差の問題という結論になりますでしょうか?

ファイル ファイルの説明
実施結果.jpg

at_satoshi.ohta

2025年3月3日 17時06分

太田です。

早速試して頂きありがとうございます。
その可能性が高いように思われます。

printfset/scripts/util.sh の copy_run() の最後の行に以下の修正を行ったあと、[App run on Armadillo] を実行すると 0 から出力されますでしょうか?
修正前:

...省略
        # Copy only -- stop here.
	[ "$#" = 0 ] && return
	container="$1"
 
	ssh -F config/ssh_config Armadillo "podman_start $container \
		&& podman attach $container"
}

修正後:

...省略
        # Copy only -- stop here.
	[ "$#" = 0 ] && return
	container="$1"
 
	ssh -F config/ssh_config Armadillo "podman_start $container \
		&& podman logs -f $container"  ★ attach を logs -f に修正
}

scripts ディレクトリは隠しファイルなので、ターミナルからprintfset ディレクトリ上で以下のコマンドを実行すると開けます。

atmark@atde9:~/printfset$ code scripts/util.sh

どうぞよろしくお願いいたします。

回答ありがとうございます。
> printfset/scripts/util.sh の copy_run() の最後の行に以下の修正を行ったあと、[App run on Armadillo] を実行すると 0 から出力されますでしょうか?
> 修正前:
>

> ...省略
>         # Copy only -- stop here.
> 	[ "$#" = 0 ] && return
> 	container="$1"
> 
> 	ssh -F config/ssh_config Armadillo "podman_start $container \
> 		&& podman attach $container"
> }
> 

>
> 修正後:
>

> ...省略
>         # Copy only -- stop here.
> 	[ "$#" = 0 ] && return
> 	container="$1"
> 
> 	ssh -F config/ssh_config Armadillo "podman_start $container \
> 		&& podman logs -f $container"  ★ attach を logs -f に修正
> }
> 

>
> scripts ディレクトリは隠しファイルなので、ターミナルからprintfset ディレクトリ上で以下のコマンドを実行すると開けます。
>

> atmark@atde9:~/printfset$ code scripts/util.sh
> 

上記の変更を行い実行した結果、確かに0から出力されるようにはなりましたが、perrorの出力順が入れ替わってしまっています(実行結果.jpg)。
これは避けられないことなのでしょうか。

ファイル ファイルの説明
実行結果.jpg

返信が連続して申し訳ございません。追加で質問させてください。

試しにprintfsetでなく、元の試験環境にも同じ措置をしたところ、
一応printfの出力自体はされるようになったものの、リアルタイムではなく、ある程度時間がたってからまとめて出力されるような挙動になっています。
これは意図された状態でしょうか

at_satoshi.ohta

2025年3月4日 11時47分

太田です。

> 上記の変更を行い実行した結果、確かに0から出力されるようにはなりましたが、perrorの出力順が入れ替わってしまっています(実行結果.jpg)。
これは避けられないことなのでしょうか。

[App run on Armadillo]を何度実行しても同じ結果になりますでしょうか?
stdout と stderr でそれぞれある程度まとめて出力していると想像しますので、出力するスピードが早すぎるとずれることもあり得ると思います。

> 試しにprintfsetでなく、元の試験環境にも同じ措置をしたところ、
> 一応printfの出力自体はされるようになったものの、リアルタイムではなく、ある程度時間がたってからまとめて出力されるような挙動になっています。
> これは意図された状態でしょうか

こちらでも、サンプルプログラムで出力するスピードを早めて試してみましたが、まとめて出力するような挙動はみられませんでした。
(blink.c の change_brightness() の usleep() の値を小さくしました。)
元の試験環境に対して、podman exec でコンテナの中に入り、同じようにプログラムを実行すると、どのように出力されるでしょうか?