3

各メモリ割り当てのバックトレースを格納するコードを書いています。次に、これらのリストをオフライン分析用のファイルに書き込みます。win32 では_AddressOfReturnAddress、バックトレースを使用して手動で作成します。アドレスは実行ごとにランダムであるため、 を使用GetModuleInformationlpBaseOfDllてベースアドレスを取得します。これは、FPO を使用しない x86 でうまく機能します。これで十分です。次に、win32 API を使用して PDB をロードし、アドレスを関数名に変換します。

Linuxでこれを行うにはどうすればよいですか?私の現在のアプローチは__builtin_return_address(x)addr2lineオフラインで同じ結果を得るために使用することです。問題は、アドレスが実行ごとにランダム化されるため、アドレスをaddr2line理解できないことです。__executable_start実行するたびに同じ値を返すため、機能しませんでした。実行時に実行可能ファイルのベース アドレスを取得する方法はありますか?

1回実行すると、次のようになります。

__executable_start: 0x8048000
backtrace:
0x9cce628
0x9cce2b8
0x9cce260
0x9cce1f8
0x9cce138
0x9cce0c8
0x9cce060
0x9cce008

そして次:

__executable_start: 0x8048000
backtrace:
0x8db6628
0x8db62b8
0x8db6260
0x8db61f8
0x8db6138
0x8db60c8
0x8db6060
0x8db6008

等々。

4

1 に答える 1

2

Linux で を使用して、dl_iterate_phdr()動的にロードされる各オブジェクトのロード アドレスを特定できます。

#define _GNU_SOURCE
#include <stdio.h>
#include <link.h>

int callback(struct dl_phdr_info *info, size_t size, void *data)
{
    printf("%s @ %#lx\n", info->dlpi_name, (unsigned long)info->dlpi_addr);
    return 0;
}

int main()
{
    dl_iterate_phdr(&callback, NULL);
    return 0;
}
于 2013-06-30T12:47:44.090 に答える