Two test cases

Denys Vlasenko dvlasenk at redhat.com
Thu Dec 11 00:21:56 UTC 2008


On Wed, 2008-12-10 at 04:54 -0800, Roland McGrath wrote:
> The current patch has regressions on block-step, step-jump-cont,
> step-jump-cont-strict, and step-to-breakpoint.  Do your tests cover
> anything new that is not already tested by one or more of those?

I looked through existing tests and none seem to simply test whether
SIGLESTEP works AT ALL, not nuances "does it work in sighandler" etc.

So this one might be useful as such:

#include <sys/types.h>
#include <sys/wait.h> 
#include <sys/ptrace.h>
#include <stdlib.h>    
#include <stdint.h>    
#include <unistd.h>    
#include <errno.h>     
#include <assert.h>    
#include <stdio.h>     

static pid_t child;

static void
cleanup (void)
{             
  if (child > 0)
    kill (child, SIGKILL);
  child = 0;              
  while (waitpid (-1, NULL, __WALL) > 0)
    continue;                           
}                                       
                                                                                                                                                                                        
static
void                                                                                                                                                                             
handler_fail (int
signo)                                                                                                                                                                
{                                                                                                                                                                                       
  cleanup
();                                                                                                                                                                           
  signal (SIGABRT,
SIG_DFL);                                                                                                                                                            
  assert
(0);                                                                                                                                                                           
}                                                                                                                                                                                       

#define NUM_SINGLESTEPS 1

int
main (int argc, char **argv)
{                           
  int i, status;            
  pid_t pid;                

  setbuf (stdout, NULL);
  atexit (cleanup);     
  signal (SIGABRT, handler_fail);
  signal (SIGINT, handler_fail); 
  signal (SIGALRM, handler_fail);
  alarm (5);                     

  child = fork ();
  assert (child >= 0);
  if (child == 0)     
    {
      /* loop for singlestepping */
#define x_10000      2845218640
#define x_100000      180235552
#define x_1000000    4074525504
#define x_10000000   1483440256
#define x_100000000  1116472576
#define x_1000000000 2621190656
      uint32_t x = 0;
      do
        x = x * 1664525 + 1013904223;
      while (x != x_1000000);
      /* reached after million iterations */
      _exit (42);
    }

  errno = 0;
  ptrace (PTRACE_ATTACH, child, (void *) 0, (void *) 0);
  assert (!errno);
  pid = waitpid (child, &status, 0);
  assert (pid == child);
  assert (WIFSTOPPED (status));
  assert (WSTOPSIG (status) == SIGSTOP);

  for (i = 0; i < NUM_SINGLESTEPS; i++)
    {
      ptrace (PTRACE_SINGLESTEP, child, (void *) 0, (void *) 0);
      assert (!errno);
      pid = waitpid (child, &status, 0);
      assert (pid == child);
      /* Known bug in 2.6.28-rc7 + utrace patch:
       * child was left to run freely, and exited */
      if (WIFEXITED (status))
        {
          assert (WEXITSTATUS (status) == 42);
          return 1;
        }
      assert (WIFSTOPPED (status));
      assert (WSTOPSIG (status) == SIGTRAP);
    }

  cleanup ();
  return 0;
}





More information about the utrace-devel mailing list