2012-04-28 11 views

答えて

12

に示すようaddr2lineに-e引数を提供することであり、あなたがargvをしている[0]:

int main (int argc, char *argv[]) 

の最初の要素argv配列はプログラム名です。

ただし、実行可能ファイルがどこにあるかを判断するだけでは必ずしも十分ではありません。この引数は実際には、プログラムを実行したプログラム(シェルやウィンドウマネージャ)によって設定されますが、あまり役に立ちません。あなたのプログラムがパス内にある、あなたはbashシェルで

your_program

で簡単にプログラムを実行すると、「your_programは、」あなたはARGVになりますすべての[0]です。

完全な実行可能パスについては、linuxには/proc filesystemがあります。 /procの下では、実行中の各プロセスはプロセスIDで指定された独自の「ディレクトリ」を取得します。実行中のプロセスは、/proc/selfの下の独自のサブツリーも見ることができます。各プロセスが取得するファイルの1つは/proc/[pid]/exeです。プロセスが実行されている実際の実行可能ファイルへのシンボリックリンクです。

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(void) { 
    char exe[1024]; 
    int ret; 

    ret = readlink("/proc/self/exe",exe,sizeof(exe)-1); 
    if(ret ==-1) { 
     fprintf(stderr,"ERRORRRRR\n"); 
     exit(1); 
    } 
    exe[ret] = 0; 
    printf("I am %s\n",exe); 
} 

あなたはまた、addr2line()に直接/proc/[pid]/exeを渡すことができる場合があります。

ですから、このような実際の完全な実行可能ファイルのパスを取得することができます。

+1

素晴らしい!これは完璧に動作します – lurscher

+0

この場合、 '/ proc/self/exe'を使うと' getpid() '呼び出しが不要になります。 – Diego

5

あなたはARGV [0]が実際の変数を参照することなく、glibcの中に保存されたポインタを使用してアクセスすることができる:https://github.com/rbdixon/glibc/blob/master/misc/init-misc.c

使用例は:

extern const char *__progname; 

int print_progname() 
{ 
    return puts(__progname); 
} 

のargv [0]は必ずしも反映していませんプログラムを呼び出すために使用された名前。 詳細については、man 2 execveおよびman 7 environを参照してください。