我們的程序中有一個自定義內存管理器,我們所有的malloc/free調用都由內存管理器管理,但是在程序的最初階段getpwuid()將會調用並在某些客戶機啓動NSS_LDAP它會調用malloc的從libc中不導致的錯誤在我們的內存管理器我們的內存管理器,從gdb的堆棧報告:帶線程本地存儲器的自定義內存管理器
Breakpoint 2, 0x0000003df8cc6eb0 in brk() from /lib64/libc.so.6
0 0x0000003df8cc6eb0 in brk() from /lib64/libc.so.6
1 0x0000003df8cc6f72 in sbrk() from /lib64/libc.so.6
2 0x0000003df8c73d29 in __default_morecore() from /lib64/libc.so.6
3 0x0000003df8c70090 in _int_malloc() from /lib64/libc.so.6
4 0x0000003df8c70c9d in malloc() from /lib64/libc.so.6
5 0x0000003df880fc65 in __tls_get_addr() from /lib64/ld-linux-x86-64.so.2
6 0x00002aaaae302a7c in _nss_ldap_inc_depth() from /lib64/libnss_ldap.so.2
7 0x00002aaaae2f91a4 in _nss_ldap_enter() from /lib64/libnss_ldap.so.2
8 0x00002aaaae2f942c in _nss_ldap_getbyname() from /lib64/libnss_ldap.so.2
9 0x00002aaaae2f9aa9 in _nss_ldap_getpwuid_r() from /lib64/libnss_ldap.so.2
10 0x0000003df8c947c5 in [email protected]@GLIBC_2.2.5() from /lib64/libc.so.6
11 0x0000003df8c9412f in getpwuid() from /lib64/libc.so.6
12 0x0000000001414be3 in lc_username()
我追查_nss_ldap_inc_depth的代碼(),似乎__tls_get_addr()得到調用,因爲使用線程本地存儲,我試圖將內存管理器更改爲共享庫,但__tls_get_addr()仍然從libc調用malloc,我怎麼能使它調用我們的內存管理器而不是libc的??
不回滾編輯:) – iabdalkader
看起來問題來自'lc_username()'你能發佈該代碼嗎? – iabdalkader
我認爲這不是因爲lc_username(),我直接調用getpwuid()並得到了相同的結果。 – DreamLinuxer