web-dev-qa-db-ja.com

GDBでデバッグしながらプログラムの環境を取得する方法

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を返します。

14
punekr12

Gdbコマンドshow environmentは、デバッグされているプログラムの環境ではなく、gdb [注を参照]に属する環境を示します。

getenvの呼び出しは、実行中のプログラムの環境を出力するための完全に合理的なアプローチのようです。

注意

Gdbは、最初に独自の環境からコピーされた環境配列を維持し、新しい子プロセスを開始するために使用します。 show environmentset 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の外部で、別の端末から同じように簡単に実行することもできます。

12
rici

set environment TZ =UTCを使用してGDBの環境ビューを変更できますが、これは実行中のプログラムには影響せず、次に下位プロセスが開始されたときに使用される環境のみに影響します。

グローバル変数environを使用して、実行中の下位プロセスの現在の環境を検査できます

2
Jonathan Wakely