2017-06-28 7 views
5

、私は、現在実行中の関数の呼び出し元のスタックを盗んして印刷できるようにしたいと思います。 私は、次の試してみました:現在実行中の関数のスタックのスタックトレースを取得するにはどうすればよいですか?トラブルシューティングのため

/******************************************************************************* 
* * 
* * xxxTracePrint - stack trace print function 
* * 
* * RETURNS: OK or ERROR 
* */ 

static void xxxTracePrint 
    (
     INSTR *caller, 
      int func, 
       int nargs, 
        int *args 
         ) 
{ 
    char buf [250]; 
    int ix; 
    int len = 0; 

    len += sprintf (&buf [len], "%#10x: %#10x (", (int)caller, func); 
    for (ix = 0; ix < nargs; ix++) { 
     if (ix != 0) 
      len += sprintf (&buf [len], ", "); 
     len += sprintf (&buf [len], "%#x", args [ix]); 
    } 

    len += sprintf (&buf [len], ")\n"); 

    printf (buf); 
} 

/******************************************************************************* 
* * 
* * xxxTrace - stack trace 
* * 
* * RETURNS: OK or ERROR 
* */ 

int xxxTrace(int tcb) 
{ 
    REG_SET regs; 

    if (tcb == 0) 
     return (ERROR); 

    taskRegsGet (tcb, &regs); 
    trcStack (&regs, (FUNCPTR) xxxTracePrint, tcb); 

    return (OK); 
} 

void DbgTest(void) 
{ 
    xxxTrace(taskIdSelf()); 
} 

が、私は得る:

JPAX-DP> DbgTest 
trcStack aborted: error in top frame 
value = 0 = 0x0 

がこのさえ可能ですか?これどうやってするの?私は(taskRegsGetのために、見た)、彼らは言う:

タスクが安定し、 が非実行状態にあることが知られている場合は、このルーチンにのみ適しています。たとえば、自己検査はお勧めできませんが、結果は予測できません。

しかし、私は他のどのような方法を適用する必要がありますか?

コンパイラはdiabとCPUのアーチであるpowerpc

+0

あなたは(バックトレースを使用することができます) 、VxWorksの中にその利用可能な場合、そのmanページには、作業例を持って、あまりにも – Pras

+0

@Harryあなたはsurceコード&WindRiver社ワークベンチへのアクセス権を持っているのですか? – cerr

+0

@cerrはい、私はあなたを助けることができるかもしれないソースコードとWinDriverのワークベンチ – Harry

答えて

1

あなたはtaskRegsGet()は、現在実行中のタスクから呼び出すことをお勧めではないことを述べていることを述べました。しかし、私は誰かがtaskDelay(1)を使って 'force context save'というコメントを見たことがある。私はそれのための信用を取ることができない、また私はそれがどのように信頼性の高い知っている、またはそれが持っているかもしれないものの副作用が、それは現在のタスクについての正しい情報を取得するために役立つかもしれない:

taskDelay (1);  /* Force context save */ 
taskRegsGet (0, &regs); /* 0 task-id for myself */ 
trcStack (&regs, NULL, 0); /* NULL function pointer for default print fcn, 0 task-id for myself */ 
1

あなたのコンパイラがGCCとあなたの建築許可の呼び出し規約がある場合は、それ(x86のことが頭に浮かぶ最初のもの)、私は__builtin_return_addressを使用してお勧めします(unsigned int型レベル)。詳細はこちらをご覧ください: https://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

+0

はるかに重い利きと必要残念ながら、私は、PowerPC上だとDIABコンパイラ – cerr

+0

反復処理では、リンクレジスタの内容を印刷できるC変数に移動するためのインラインアセンブリを書くことができます。 diabがサポートしていないドキュメントインラインアセンブリ構文を使用する以外に、このアプローチの主な欠点は、現在の関数の呼び出し元しか見つけることができないことです。次の呼び出しを取得するには、呼び出し関数を変更してリンクレジスタの内容を取得する必要があります。私はARMとPPCカードでこれを使用しましたが、それは最後の手段です。 – vxWizard

+0

タスクで「tt」を実行できますか? vxWorksシェルのtt 。また、タスクの下のオプションを設定して、 "taskOptionsSet ,2,0"に役立つかどうか確認してください。 –

関連する問題