2

私はこれに約1日苦労しています。

簡単な共有ライブラリとテスト プログラムを作成できました。これを ltrace 制御下で実行すると、静的メソッド、仮想メソッド、および純粋仮想メソッドのメソッド名を期待どおりに取得できます。

cmake を使用して共有ライブラリを構築します。純粋な仮想親クラスがあり、いくつかのメソッドが例外をスローします。

テスト プログラムで ltrace を実行すると、静的メソッドのメソッド名しか取得できません。

代わりに、次のような行がたくさん表示されます。

__gxx_personality_v0(1, 2, 0x474e5543432b2b00, 0x256c800, 0x7fff8d763170)

make VERBOSE=1 ショー:

...
cd /home/chchr/src/build/csp-api/platform_services_lib_dynamic && /usr/bin/c++   -Dplatform_services_EXPORTS -DVERSION=10717 -DMAJOR_PACKAGE_VERSION=0 -DMINOR_PACKAGE_VERSION=9 -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -DRMOF_BIN=\"/usr/share/rmof.bin\" -shared -g -fPIC -I/home/chchr/src/csp-api/shared/inc -I/home/chchr/src/csp-api/enclosure-lib/inc -I/home/chchr/src/csp-api/compute-lib/inc -I/home/chchr/src/csp-api/storage-lib/inc -I/home/chchr/src/csp-api/RCIM/librcimcli -I/home/chchr/src/csp-api/RCIM/libRCIM    -g -Wall -o CMakeFiles/platform_services.dir/__/shared/src/System.cpp.o -c /home/chchr/src/csp-api/shared/src/System.cpp
...
/usr/bin/c++  -fPIC  -shared -g   -shared -Wl,-soname,libplatform_services.so -o libplatform_services.so CMakeFiles/platform_services.dir/__/shared/src/System.cpp.o CMakeFiles/platform_services.dir/__/shared/src/System_Impl.cpp.o ../RCIM/librcim.so -lssl -lssh2 -lgcrypt -lslp -lcurl -lboost_system-mt -lboost_filesystem-mt -lboost_thread-mt -lpthread -Wl,-rpath,/home/chchr/src/build/csp-api/RCIM:

どこを見ればいいですか?ありがとう!

よし、契約だ。オブジェクトがヒープに割り当てられている場合、仮想/純粋仮想メソッドが表示されません。スタック上にある場合は、次のようにします。

#include "foo.hpp"

int main()
{
    foo::static_foo();

    foo_child* f = new foo_child;
    f->real_foo();

    // ltrace doesn't report this one?
    f->virtual_foo();
    // ltrace doesn't report this one?
    f->pure_virtual_foo();

    foo_child g;
    g.real_foo();

    // ltrace does report this one!
    g.virtual_foo();
    // ltrace does report this one!
    g.pure_virtual_foo();

    return 0;
}



$ ltrace -C ./f
(0, 0, 0x23c300, -1, 0x1f25bc2)                                                                       = 0x3715a21160
__libc_start_main(0x4008e4, 1, 0x7fff1d54aa68, 0x400a40, 0x400a30 <unfinished ...>
foo::static_foo()(1, 0x7fff1d54aa68, 0x7fff1d54aa78, 4, 0x3715f8b300)                                 = 0x3715f8cf60
operator new(unsigned long)(8, 0x7fff1d54aa68, 0x7fff1d54aa78, 4, 0x3715f8b300)                       = 0xfc4010
foo::real_foo()(0xfc4010, 0xfc4020, 33, 0, 135168)                                                    = 0xfc4010
foo::real_foo()(0x7fff1d54a960, 0xfc4020, 0x7fc684611a86, 0, 135168)                                  = 0x7fff1d54a960
foo::virtual_foo()(0x7fff1d54a960, 0xfc4020, 0x7fc684611a86, 0, 135168)                               = 0x7fff1d54a960
foo_child::pure_virtual_foo()(0x7fff1d54a960, 0xfc4020, 0x7fc684611a86, 0, 135168)                    = 0x7fff1d54a960
+++ exited (status 0) +++

どんな手掛かり?

4

2 に答える 2

1

これはltraceのバグです。正式に報告された:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug = 669416

于 2012-04-24T14:54:37.083 に答える
1

C++ メソッド名のトレースをサポートするために、ltrace に「-C」オプションを追加

ltrace の「-C」オプションの man ページの説明は次のとおりです。

-C, --demangle 低レベルのシンボル名をユーザーレベルの名前にデコード (demangle) します。システムによって付加された最初のアンダースコアを削除するだけでなく、これにより C++ 関数名が読みやすくなります。

ltrace -C プログラム

出力は次のようになります。

*std::basic_string, std::allocator >::basic_string(std::string const&)(0x8fb940, 0x7fff6fc680b0, 0x7fff6fc680b0, 0x50535f4444415f46, 0x4c4941465f455241) = 0x1970be8*

わかりにくいところもありますが、楽しんでください^_^

于 2012-04-19T14:18:55.710 に答える