Linux上のGDBでプログラムをデバッグしています。私はgetenv
およびsetenv
呼び出しを使用して、環境変数の読み取りと設定を行っています。たとえば、タイムゾーンのTZ環境変数を設定するためにsetenv("TZ", "UTC", 1);
を呼び出しています。
Env変数が設定されているかどうかを確認するには、GDBコマンド_show environment
_を使用しています。これにより、すべての環境変数とその値が出力されます。ただし、TZ
が設定されていることは表示されません。
コマンド_show environment TZ
_でも_Environment variable "TZ" not defined.
_と言います
デバッグされたプログラムの環境をチェックする別の方法はありますか?
p *(char *) getenv("TZ")
は正しい値UTC
を返します。
Gdbコマンドshow environment
は、デバッグされているプログラムの環境ではなく、gdb
[注を参照]に属する環境を示します。
getenv
の呼び出しは、実行中のプログラムの環境を出力するための完全に合理的なアプローチのようです。
Gdbは、最初に独自の環境からコピーされた環境配列を維持し、新しい子プロセスを開始するために使用します。 show environment
とset environment
はこの環境で機能するため、set environment
は次回の環境変数を変更しますあなたデバッグ中のプログラムを開始します。プログラムが開始されると、ローダーは環境をプログラムのアドレス空間にコピーし、setenv
で行われた変更は、gdb
によって維持されているものではなく、その配列に適用されます。
Linuxでは、すべてのプロセスの環境は、疑似ファイル/proc/PID/environ
を介して利用できます。ここで、PID
はプロセスのpidに置き換えられます。そのファイルの値はnullで終了する文字列のリストであるため、ファイルを印刷するには少しの作業が必要です。
Gdb内で、デバッグするプログラムの実行を開始したら、info proc
を使用してそのpidを取得し、それを使用して環境全体を出力できます。
(gdb) info proc
process 6074
...
(gdb) Shell xargs -0 printf %s\\n < /proc/6074/environ
XDG_VTNR=7
KDE_MULTIHEAD=false
...
もちろん、gdbの外部で、別の端末から同じように簡単に実行することもできます。
set environment TZ =UTC
を使用してGDBの環境ビューを変更できますが、これは実行中のプログラムには影響せず、次に下位プロセスが開始されたときに使用される環境のみに影響します。
グローバル変数environ
を使用して、実行中の下位プロセスの現在の環境を検査できます