Welcome to the new Parasoft forums! We hope you will enjoy the site and try out some of the new features, like sharing an idea you may have for one of our products or following a category.
Using LD_PRELOAD for a Java executable with Insure++
LegacyForum
Posts: 1,664 ✭✭
Hi,
I am running insure++ for a java application. Because of the java executable that ignites my application isn't instrumented, i have to add to LD_PRELOAD insure specific libraries in order not to take runtime errors. My LD_PRELOAD looks like this:
The problem is that when i run the application, reports and coverage information is being written for bash shell (!) as well apart from my application. [The bash shell is used to launch the application]. Is it a way in order not to take such information for system specific software?
My runtime .psrc looks like this:
Moreover this java application sporadically keeps cloning itself only when ran instrumented under insure++.
An instance of such a behavior is the following:
11463 11462 8 08:38 pts/0 00:00:45 java -D -Xrs -Xmx16m -Xss1m
11501 11463 0 08:38 pts/0 00:00:00 java -D -Xrs -Xmx16m -Xss1m
Any clue why this could be happening?
Is it possible that these two problems can be correlated?
Thanks in advance
Panagiotis
I am running insure++ for a java application. Because of the java executable that ignites my application isn't instrumented, i have to add to LD_PRELOAD insure specific libraries in order not to take runtime errors. My LD_PRELOAD looks like this:
LD_PRELOAD=libinsure.so:libinsure_mt_nptl.so:libtql_pthread_gcc.so.1:libtql_c_gcc.so.1
The problem is that when i run the application, reports and coverage information is being written for bash shell (!) as well apart from my application. [The bash shell is used to launch the application]. Is it a way in order not to take such information for system specific software?
My runtime .psrc looks like this:
insure++.unsuppress all
insure++.leak_search off
insure++.use_lockf 10
insure++.report_banner off
insure++.coverage_banner off
insure++.exit_on_error_banner off
insure++.symbol_banner on
insure++.symbol_table on
insure++.reportfile /var/insure/rpts/%v-%p-insrpt.txt
insure++.summarize leaks outstanding
insure++.coverage_log_file /var/insure/cov/%v-inscov.log
Moreover this java application sporadically keeps cloning itself only when ran instrumented under insure++.
An instance of such a behavior is the following:
11463 11462 8 08:38 pts/0 00:00:45 java -D -Xrs -Xmx16m -Xss1m
11501 11463 0 08:38 pts/0 00:00:00 java -D -Xrs -Xmx16m -Xss1m
Any clue why this could be happening?
Is it possible that these two problems can be correlated?
Thanks in advance
Panagiotis
Tagged:
0
Comments
-
Panagiotis,
Seems like 2 issues.
Setting and unsetting LD_PRELOAD is a system level thing; Insure++ can't really control that. Insure++ does have an option 'runtime off' that effectively turns Insure++ off, but I can't think of a good way to get that option turned on in the child processes you want to ignore. Perhaps LD_PRELOAD could be set or unset in different places? Separating report_files based on %v and %p is what I would have recommended, and just ignoring the bash processes, but it seems you are already doing this.
As far as the java cloning issue; I am not sure; I do know some versions of java respawm themselves under certain circumstances. I suggest looking at /proc/<java_pids>/environment or something if you want to investigate that further. Again, your best and laziest bet, is to simply ignore the extraneous process and report file.
If you use _Insure_printf() to print from your instrumented code, then you could simply grep for that string in the report files, and ignore any report files that lacked it.
0 -
If you do this:
LD_PRELOAD=libinsure.so:libinsure_mt_nptl.so:libtql_pthread_gcc.so.1:libtql_c_gcc.so.1
you have effectively told the shell that you want these libraries pre-loaded for *everything* you do. Don't do that. Instead, just LD_PRELOAD for the one command that you want. Assuming your application that needs to be preloaded is java, (with command line: "java -jar foo.jar"), then the appropriate thing to do is:LD_PRELOAD=libinsure.so:libinsure_mt_nptl.so:libtql_pthread_gcc.so.1:libtql_c_gcc.so.1 java -jar foo.jar
This way, the LD_PRELOAD will only affect the ONE java command, and nothing else.
--Rich0