From: Julian Seward Date: Mon, 20 May 2002 23:38:33 +0000 (+0000) Subject: Improve diagnostic info printed by failures in X-Git-Tag: svn/VALGRIND_1_0_3~169 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=33c580dbf10f0f4833f23ba9e8d20a0b46318011;p=thirdparty%2Fvalgrind.git Improve diagnostic info printed by failures in VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH). git-svn-id: svn://svn.valgrind.org/valgrind/trunk@297 --- diff --git a/coregrind/vg_main.c b/coregrind/vg_main.c index ddaf556e2c..399291d682 100644 --- a/coregrind/vg_main.c +++ b/coregrind/vg_main.c @@ -1164,37 +1164,66 @@ void VG_(oynk) ( Int n ) "valgrinq.so", which doesn't do anything. This is used to avoid tracing into child processes. To make this work the build system also supplies a dummy file, "valgrinq.so". + + Also look for $(libdir)/lib/valgrind in LD_LIBRARY_PATH and change + it to $(libdir)/lib/valgrinq, so as to make our libpthread.so + disappear. */ void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str, Char* ld_library_path_str ) { - Char* p; - vg_assert(ld_preload_str != NULL); - vg_assert(ld_library_path_str != NULL); + Char* p_prel = NULL; + Char* p_path = NULL; + Int what = 0; + if (ld_preload_str == NULL || ld_library_path_str == NULL) + goto mutancy; + /* VG_(printf)("%s %s\n", ld_preload_str, ld_library_path_str); */ - /* in LD_PRELOAD, turn valgrind.so into valgrinq.so. */ - p = VG_(strstr)(ld_preload_str, "valgrind.so"); - if (p == NULL) { + p_prel = VG_(strstr)(ld_preload_str, "valgrind.so"); + p_path = VG_(strstr)(ld_library_path_str, VG_LIBDIR); + + if (p_prel == NULL) { /* perhaps already happened? */ - vg_assert(VG_(strstr)(ld_preload_str, "valgrinq.so") != NULL); - vg_assert(VG_(strstr)(ld_library_path_str, "lib/valgrinq") != NULL); + what = 1; + if (VG_(strstr)(ld_preload_str, "valgrinq.so") == NULL) + goto mutancy; + if (VG_(strstr)(ld_library_path_str, "lib/valgrinq") == NULL) + goto mutancy; return; } - vg_assert(p[7] == 'd'); - p[7] = 'q'; + what = 2; + if (p_path == NULL) goto mutancy; + + /* in LD_PRELOAD, turn valgrind.so into valgrinq.so. */ + what = 3; + if (p_prel[7] != 'd') goto mutancy; + p_prel[7] = 'q'; /* in LD_LIBRARY_PATH, turn $libdir/valgrind (as configure'd) from .../lib/valgrind .../lib/valgrinq, which doesn't exist, so that our own libpthread.so goes out of scope. */ - p = VG_(strstr)(ld_library_path_str, VG_LIBDIR); - vg_assert(NULL != p); - p += VG_(strlen)(VG_LIBDIR); - p += VG_(strlen)("/valgrind"); - p --; - vg_assert(p[0] == 'd'); - p[0] = 'q'; + p_path += VG_(strlen)(VG_LIBDIR); + what = 4; + if (p_path[0] != '/') goto mutancy; + p_path++; /* step over / */ + what = 5; + if (p_path[7] != 'd') goto mutancy; + p_path[7] = 'q'; + return; + + mutancy: + VG_(printf)( + "\nVG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH): internal error:\n" + " what = %d\n" + " ld_preload_str = `%s'\n" + " ld_library_path_str = `%s'\n" + " p_prel = `%s'\n" + " p_path = `%s'\n" + " VG_LIBDIR = `%s'\n", + what, ld_preload_str, ld_library_path_str, p_prel, p_path, VG_LIBDIR ); + VG_(panic)("VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) failed\n"); } diff --git a/vg_main.c b/vg_main.c index ddaf556e2c..399291d682 100644 --- a/vg_main.c +++ b/vg_main.c @@ -1164,37 +1164,66 @@ void VG_(oynk) ( Int n ) "valgrinq.so", which doesn't do anything. This is used to avoid tracing into child processes. To make this work the build system also supplies a dummy file, "valgrinq.so". + + Also look for $(libdir)/lib/valgrind in LD_LIBRARY_PATH and change + it to $(libdir)/lib/valgrinq, so as to make our libpthread.so + disappear. */ void VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) ( Char* ld_preload_str, Char* ld_library_path_str ) { - Char* p; - vg_assert(ld_preload_str != NULL); - vg_assert(ld_library_path_str != NULL); + Char* p_prel = NULL; + Char* p_path = NULL; + Int what = 0; + if (ld_preload_str == NULL || ld_library_path_str == NULL) + goto mutancy; + /* VG_(printf)("%s %s\n", ld_preload_str, ld_library_path_str); */ - /* in LD_PRELOAD, turn valgrind.so into valgrinq.so. */ - p = VG_(strstr)(ld_preload_str, "valgrind.so"); - if (p == NULL) { + p_prel = VG_(strstr)(ld_preload_str, "valgrind.so"); + p_path = VG_(strstr)(ld_library_path_str, VG_LIBDIR); + + if (p_prel == NULL) { /* perhaps already happened? */ - vg_assert(VG_(strstr)(ld_preload_str, "valgrinq.so") != NULL); - vg_assert(VG_(strstr)(ld_library_path_str, "lib/valgrinq") != NULL); + what = 1; + if (VG_(strstr)(ld_preload_str, "valgrinq.so") == NULL) + goto mutancy; + if (VG_(strstr)(ld_library_path_str, "lib/valgrinq") == NULL) + goto mutancy; return; } - vg_assert(p[7] == 'd'); - p[7] = 'q'; + what = 2; + if (p_path == NULL) goto mutancy; + + /* in LD_PRELOAD, turn valgrind.so into valgrinq.so. */ + what = 3; + if (p_prel[7] != 'd') goto mutancy; + p_prel[7] = 'q'; /* in LD_LIBRARY_PATH, turn $libdir/valgrind (as configure'd) from .../lib/valgrind .../lib/valgrinq, which doesn't exist, so that our own libpthread.so goes out of scope. */ - p = VG_(strstr)(ld_library_path_str, VG_LIBDIR); - vg_assert(NULL != p); - p += VG_(strlen)(VG_LIBDIR); - p += VG_(strlen)("/valgrind"); - p --; - vg_assert(p[0] == 'd'); - p[0] = 'q'; + p_path += VG_(strlen)(VG_LIBDIR); + what = 4; + if (p_path[0] != '/') goto mutancy; + p_path++; /* step over / */ + what = 5; + if (p_path[7] != 'd') goto mutancy; + p_path[7] = 'q'; + return; + + mutancy: + VG_(printf)( + "\nVG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH): internal error:\n" + " what = %d\n" + " ld_preload_str = `%s'\n" + " ld_library_path_str = `%s'\n" + " p_prel = `%s'\n" + " p_path = `%s'\n" + " VG_LIBDIR = `%s'\n", + what, ld_preload_str, ld_library_path_str, p_prel, p_path, VG_LIBDIR ); + VG_(panic)("VG_(mash_LD_PRELOAD_and_LD_LIBRARY_PATH) failed\n"); }