ARM 9 で uclibc Linux を実行しています。問題は、uclibc がバックトレースをサポートしていないことです。コア ダンプが発生すると、コール スタックを取得できません。
誰かがそれに対する良い解決策を持っていますか?
たとえば、uclibc のバックトレースの既存の移植、またはコア ダンプが発生したときにコール スタックを取得するための適切な方法 (uclibc + ARM + Linux) はありますか?
ARM 9 で uclibc Linux を実行しています。問題は、uclibc がバックトレースをサポートしていないことです。コア ダンプが発生すると、コール スタックを取得できません。
誰かがそれに対する良い解決策を持っていますか?
たとえば、uclibc のバックトレースの既存の移植、またはコア ダンプが発生したときにコール スタックを取得するための適切な方法 (uclibc + ARM + Linux) はありますか?
アップデート:
x86 および ARM (XScale) の uclibc でサポートするパッチが作成され、シンボルが使用されているようです。backtrace()
__libc_stack_end
元の回答:
backtrace()
私たちが使用していた glibc のバージョンがARM プロセッサに機能を提供しなかったプロジェクトに取り組んだため、__libc_stack_end
シンボルを使用して glibc の外部で独自のものを開発しました。以下は結果のコードです。おそらく、それを使用して uclibcbacktrace()
関数を作成できます。
extern void * __libc_stack_end;
struct backtrace_frame_t
{
void * fp;
void * sp;
void * lr;
void * pc;
};
int backtrace(void ** array, int size)
{
void * top_frame_p;
void * current_frame_p;
struct backtrace_frame_t * frame_p;
int frame_count;
top_frame_p = __builtin_frame_address(0);
current_frame_p = top_frame_p;
frame_p = (struct backtrace_frame_t*)((void**)(current_frame_p)-3);
frame_count = 0;
if (__builtin_return_address(0) != frame_p->lr)
{
fprintf(stderr, "backtrace error: __builtin_return_address(0) != frame_p->lr\n");
return frame_count;
}
if (current_frame_p != NULL
&& current_frame_p > (void*)&frame_count
&& current_frame_p < __libc_stack_end)
{
while (frame_count < size
&& current_frame_p != NULL
&& current_frame_p > (void*)&frame_count
&& current_frame_p < __libc_stack_end)
{
frame_p = (struct backtrace_frame_t*)((void**)(current_frame_p)-3);
array[frame_count] = frame_p->lr;
frame_count++;
current_frame_p = frame_p->fp;
}
}
return frame_count;
}
注: この__libc_stack_end
シンボルは、最近のバージョンの glibc ではエクスポートされなくなりました。このシンボルまたは類似のシンボルが uclibc に存在するかどうかはわかりません。
ここで尋ねられた同じ質問を見てください:
http://lists.ulibc.org/pipermail/uclibc/2010-June/044115.html
ここからのパッチについて言及しています:
http://git.stlinux.com/?p=stm/uclibc.git;a=commit;h=d6a3d9ece5922a337800a8e2ed4db7e226f9ccb3