Re: [DynInst_API:] Hung process


Date: Wed, 18 Feb 2015 20:00:59 +0100
From: Gerard <ggarcia@xxxxxxxxxxxx>
Subject: Re: [DynInst_API:] Hung process
I'm not sure at which point it hangs, but I have set up an example that I think mimics what happens with my application. In this example the mutatee hangs after creatingÂ32294 threads. I'm using the latest master version.

Thanks,

Gerard

2015-02-16 18:51 GMT+01:00 Bill Williams <bill@xxxxxxxxxxx>:
On 02/16/2015 10:35 AM, Gerard wrote:
Hi,

I'm having another problem. I increased the MAX_THREADS variable to
10240 because I need to instrument a mutatee that creates around 10000
threads. After increasing the variable I could instrument the mutatee
without problems, but I added more snippets and the process hung again,
this time after creating 3999 threads. Now, it doesn't matter if I
increase even more the constant, it still hangs.

Is there any other reason why the mutatee could hang or is there any
other limit somewhere?

I'm not aware of other hardcoded limits, and if you already had tramp guards disabled, it seems likely that you're running into some form of bad behavior at scale that's independent of MAX_THREADS.

Is it possible for you to put together a simple reproducer (mutator/mutatee) and send that to me? Do you know whether the process is hanging at a particular point (thread creation/destruction, process exit)?

Thanks,

Gerard

2015-02-04 11:22 GMT+01:00 Gerard <nouboh@xxxxxxxxx
<mailto:nouboh@xxxxxxxxx>>:

  Thanks! That was exactly the problem. I have increased the constant
  MAX_THREADS and now I don't have this problem anymore. Is there any
  reason why the constant is set to 32 instead of a higher value?

  I also have tried to find how to dynamically change
  the DYNINST_max_num_threads value but I haven't found where is it
  implemented (version 8.2.1). And about disabling tramp guards, I
  already had them disabled so it seems that this workaround does not
  solve the problem.

  Gerard

  2015-02-03 20:13 GMT+01:00 Barton Miller <bart@xxxxxxxxxxx
  <mailto:bart@xxxxxxxxxxx>>:

    Disabling tramp guards certainly works if you really know that
    you're not recursing. That can be subtle and error prone, which
    is why tramp guards were invented. Proceed cautiously here.

    --bart


    On 2/3/2015 12:02 PM, Matthew LeGendre wrote:

      Another possible fix may be to disable tramp guards. Tramp
      guards are used to prevent recursive instrumentation. For
      example, if you instrument malloc() with instrumentation
      that calls malloc(), then tramp guards will prevent you from
      going into infinite recursion.

      If you already know that your instrumentation can't
      infinitely recurse,
      then disabling tramp guards will give a big performance win
      and may work around this hang. To disable tramp guards, put
      a call to BPatch::setTrampRecursive(__true) before you
      insert instrumentation.

      -Matt
      _________________________________________________
      Dyninst-api mailing list
      Dyninst-api@xxxxxxxxxxx <mailto:Dyninst-api@xxxxxxxxedu>
      https://lists.cs.wisc.edu/__mailman/listinfo/dyninst-api
      <https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api>


    _________________________________________________
    Dyninst-api mailing list
    Dyninst-api@xxxxxxxxxxx <mailto:Dyninst-api@xxxxxxxxedu>
    https://lists.cs.wisc.edu/__mailman/listinfo/dyninst-api
    <https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api>





_______________________________________________
Dyninst-api mailing list
Dyninst-api@xxxxxxxxxxx
https://lists.cs.wisc.edu/mailman/listinfo/dyninst-api



--
--bw

Bill Williams
Paradyn Project
bill@xxxxxxxxxxx

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

static int i = 0;

void *dummy_thread(void *v)
{
	printf("%d\n", i++);
	pthread_exit(NULL);
}

int main(int argc, char const *argv[])
{

	while (1) {
		pthread_t dummy_t;
		pthread_create(&dummy_t, NULL, dummy_thread, NULL);
		pthread_join(dummy_t, NULL);
	}

	return 0;
}
#include "BPatch.h"
#include "BPatch_addressSpace.h"
#include "BPatch_process.h"
#include "BPatch_binaryEdit.h"
#include "BPatch_function.h"
#include "BPatch_point.h"
#include "BPatch_flowGraph.h"

#define DYNINSTAPI_RT_LIB "/usr/local/lib64/libdyninstAPI_RT.so"

BPatch bpatch;

int main(int argc, char const *argv[])
{
	setenv("DYNINSTAPI_RT_LIB", DYNINSTAPI_RT_LIB, 0);


	bpatch.setTrampRecursive(true);
	bpatch.setSaveFPR(false);

	char const *mutatee_argv[] = {
		"mutatee",
		NULL
	};
	BPatch_addressSpace *app = bpatch.processCreate("./mutatee", mutatee_argv);
	
	BPatch_process *appProc = dynamic_cast<BPatch_process *>(app);
	appProc->continueExecution();

	while(!appProc->isTerminated()){
		bpatch.waitForStatusChange();
	}


	return 0;
}
[← Prev in Thread] Current Thread [Next in Thread→]