public inbox for frysk@sourceware.org
 help / color / mirror / Atom feed
From: Mark Wielaard <mark@klomp.org>
To: frysk <frysk@sourceware.org>
Subject: nodebug and noeh frame unwind tests
Date: Wed, 23 Jan 2008 14:33:00 -0000	[thread overview]
Message-ID: <1201098751.3092.17.camel@dijkstra.wildebeest.org> (raw)

[-- Attachment #1: Type: text/plain, Size: 1544 bytes --]

Hi,

This patch adds semi-automated frame (unwind) tests by adding Makefile
rules to generate debug_frame less or eh_frame less versions of various
funit-test programs. All tests are now run 3 times, once with all info
available, once with only debug_frame available and once with only
eh_frame available. This depends on both being available by default
because Makefile.rules makes sure gcc gets both the -g and
-fasynchronous-unwind-tables flags (the last is the default on various
systems like fedora, but is added explicitly in the build for other
systems - or if the user might happen to use upstream gcc).

frysk-core/ChangeLog:
2008-01-23  Mark Wielaard  <mwielaard@redhat.com>

    * Makefile.am: Add rules to create -nodebug and -noeh versions of
    funit-stacks, funit-empty-functions, funit-stacks-exit,
    funit-scopes, funit-scopes-workaround, funit-stack-inlined,
    funit-stacks-values, funit-stacks-linenum and
    funit-cpp-scopes-class.

frysk-core/frysk/debuginfo/ChangeLog:
2008-01-23  Mark Wielaard  <mwielaard@redhat.com>

    * TestFrameDebugInfo.java: Add NoDebug and NoEH variants of
    testFrameDebugInfoStackTrace, testFrameCompilerInlinedFunctions,
    testFrameAdjustedAddress, testFrameScopes,
    testDebugInfoFrameScopes, testFrameScopesWorkAround,
    testGetInlinedSubroutines, testVirtualStackTrace,
    testInlinedFunctionDerailment, testLineNumbers and
    testThatArtificialParametersAreIgnored.

Various of these tests failed before all the libunwind debug_frame
patches were in place.

Cheers,

Mark

[-- Attachment #2: frame-tests.patch --]
[-- Type: text/x-patch, Size: 16039 bytes --]

diff --git a/frysk-core/Makefile.am b/frysk-core/Makefile.am
index 9f8581b..10d88cc 100644
--- a/frysk-core/Makefile.am
+++ b/frysk-core/Makefile.am
@@ -97,6 +97,121 @@ installcheck-funit:
 # Create executables for type tests for TestTypeEntry.java.
 frysk/debuginfo/TestTypeEntry.java: frysk/pkglibdir/funit-type-entry.c
 
+# Executable without debug_frame and without eh_frame for Frame tests.
+# Note that this depends on both being available by default because
+# Makefile.rules adds both -g and -fasynchronous-unwind-tables
+# WARNING. eh_frames can only be removed if it isn't used during runtime
+# of the test program (in particular c++ exceptions).
+
+# funit-stacks
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stacks-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stacks-noeh
+frysk_pkglibdir_funit_stacks_nodebug_SOURCES =
+frysk_pkglibdir_funit_stacks_noeh_SOURCES =
+frysk/pkglibdir/funit-stacks-nodebug: frysk/pkglibdir/funit-stacks
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-stacks $@
+frysk/pkglibdir/funit-stacks-noeh: frysk/pkglibdir/funit-stacks
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-stacks $@
+
+# funit-empty-functions
+pkglib_PROGRAMS += frysk/pkglibdir/funit-empty-functions-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-empty-functions-noeh
+frysk_pkglibdir_funit_empty_functions_nodebug_SOURCES =
+frysk_pkglibdir_funit_empty_functions_noeh_SOURCES =
+frysk/pkglibdir/funit-empty-functions-nodebug: frysk/pkglibdir/funit-empty-functions
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-empty-functions $@
+frysk/pkglibdir/funit-empty-functions-noeh: frysk/pkglibdir/funit-empty-functions
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-empty-functions $@
+
+# funit-stacks-exit
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stacks-exit-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stacks-exit-noeh
+frysk_pkglibdir_funit_stacks_exit_nodebug_SOURCES =
+frysk_pkglibdir_funit_stacks_exit_noeh_SOURCES =
+frysk/pkglibdir/funit-stacks-exit-nodebug: frysk/pkglibdir/funit-stacks-exit
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-stacks-exit $@
+frysk/pkglibdir/funit-stacks-exit-noeh: frysk/pkglibdir/funit-stacks-exit
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-stacks-exit $@
+
+# funit-scopes
+pkglib_PROGRAMS += frysk/pkglibdir/funit-scopes-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-scopes-noeh
+frysk_pkglibdir_funit_scopes_nodebug_SOURCES =
+frysk_pkglibdir_funit_scopes_noeh_SOURCES =
+frysk/pkglibdir/funit-scopes-nodebug: frysk/pkglibdir/funit-scopes
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-scopes $@
+frysk/pkglibdir/funit-scopes-noeh: frysk/pkglibdir/funit-scopes
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-scopes $@
+
+# funit-scopes-workaround
+pkglib_PROGRAMS += frysk/pkglibdir/funit-scopes-workaround-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-scopes-workaround-noeh
+frysk_pkglibdir_funit_scopes_workaround_nodebug_SOURCES =
+frysk_pkglibdir_funit_scopes_workaround_noeh_SOURCES =
+frysk/pkglibdir/funit-scopes-workaround-nodebug: frysk/pkglibdir/funit-scopes-workaround
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-scopes-workaround $@
+frysk/pkglibdir/funit-scopes-workaround-noeh: frysk/pkglibdir/funit-scopes-workaround
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-scopes-workaround $@
+
+# funit-stack-inlined
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stack-inlined-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stack-inlined-noeh
+frysk_pkglibdir_funit_stack_inlined_nodebug_SOURCES =
+frysk_pkglibdir_funit_stack_inlined_noeh_SOURCES =
+frysk/pkglibdir/funit-stack-inlined-nodebug: frysk/pkglibdir/funit-stack-inlined
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-stack-inlined $@
+frysk/pkglibdir/funit-stack-inlined-noeh: frysk/pkglibdir/funit-stack-inlined
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-stack-inlined $@
+
+# funit-stacks-values
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stacks-values-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stacks-values-noeh
+frysk_pkglibdir_funit_stacks_values_nodebug_SOURCES =
+frysk_pkglibdir_funit_stacks_values_noeh_SOURCES =
+frysk/pkglibdir/funit-stacks-values-nodebug: frysk/pkglibdir/funit-stacks-values
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-stacks-values $@
+frysk/pkglibdir/funit-stacks-values-noeh: frysk/pkglibdir/funit-stacks-values
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-stacks-values $@
+
+# funit-stacks-linenum
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stacks-linenum-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-stacks-linenum-noeh
+frysk_pkglibdir_funit_stacks_linenum_nodebug_SOURCES =
+frysk_pkglibdir_funit_stacks_linenum_noeh_SOURCES =
+frysk/pkglibdir/funit-stacks-linenum-nodebug: frysk/pkglibdir/funit-stacks-linenum
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-stacks-linenum $@
+frysk/pkglibdir/funit-stacks-linenum-noeh: frysk/pkglibdir/funit-stacks-linenum
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-stacks-linenum $@
+
+# funit-cpp-scopes-class
+pkglib_PROGRAMS += frysk/pkglibdir/funit-cpp-scopes-class-nodebug
+pkglib_PROGRAMS += frysk/pkglibdir/funit-cpp-scopes-class-noeh
+frysk_pkglibdir_funit_cpp_scopes_class_nodebug_SOURCES =
+frysk_pkglibdir_funit_cpp_scopes_class_noeh_SOURCES =
+frysk/pkglibdir/funit-cpp-scopes-class-nodebug: frysk/pkglibdir/funit-cpp-scopes-class
+	objcopy --remove-section=.debug_frame \
+		frysk/pkglibdir/funit-cpp-scopes-class $@
+frysk/pkglibdir/funit-cpp-scopes-class-noeh: frysk/pkglibdir/funit-cpp-scopes-class
+	objcopy --remove-section=.eh_frame_hdr --remove-section=.eh_frame \
+		frysk/pkglibdir/funit-cpp-scopes-class $@
+
+
 # Create executables for symbol tests for TestSymbol.java.
 
 pkglib_PROGRAMS += frysk/pkglibdir/funit-symbols-nodebug
diff --git a/frysk-core/frysk/debuginfo/TestFrameDebugInfo.java b/frysk-core/frysk/debuginfo/TestFrameDebugInfo.java
index 3cf8375..3a8e7a8 100644
--- a/frysk-core/frysk/debuginfo/TestFrameDebugInfo.java
+++ b/frysk-core/frysk/debuginfo/TestFrameDebugInfo.java
@@ -1,6 +1,6 @@
 // This file is part of the program FRYSK.
 //
-// Copyright 2007, Red Hat Inc.
+// Copyright 2007, 2008, Red Hat Inc.
 //
 // FRYSK is free software; you can redistribute it and/or modify it
 // under the terms of the GNU General Public License as published by
@@ -69,10 +69,25 @@ public class TestFrameDebugInfo
     /// I am not looking at what you are typing. I just have to see ya type
   Logger logger = Logger.getLogger("frysk");
 
-  public void testFrameDebugInfoStackTrace ()
+  public void testFrameDebugInfoStackTrace()
+  {
+    frameDebugInfoStackTrace("");
+  }
+
+  public void testFrameDebugInfoStackTraceNoDebug()
+  {
+    frameDebugInfoStackTrace("-nodebug");
+  }
+
+  public void testFrameDebugInfoStackTraceNoEH()
+  {
+    frameDebugInfoStackTrace("-noeh");
+  }
+
+  public void frameDebugInfoStackTrace(String ext)
   {
       
-    Task task = (new DaemonBlockedAtSignal("funit-stacks")).getMainTask();
+    Task task = (new DaemonBlockedAtSignal("funit-stacks" + ext)).getMainTask();
     
     StringWriter stringWriter = new StringWriter();
     DebugInfoFrame frame = DebugInfoStackFactory.createDebugInfoStackTrace(task);
@@ -86,22 +101,52 @@ public class TestFrameDebugInfo
     
   }
   
-  public void testFrameCompilerIlinedFucntions ()
+  public void testFrameCompilerInlinedFunctions()
+  {
+    frameCompilerInlinedFunctions("");
+  }
+
+  public void testFrameCompilerInlinedFunctionsNoDebug()
+  {
+    frameCompilerInlinedFunctions("-nodebug");
+  }
+
+  public void testFrameCompilerInlinedFunctionsNoEH()
+  {
+    frameCompilerInlinedFunctions("-noeh");
+  }
+
+  public void frameCompilerInlinedFunctions(String ext)
   {
 
-    Task task = (new DaemonBlockedAtSignal("funit-empty-functions")).getMainTask();
+    Task task = (new DaemonBlockedAtSignal("funit-empty-functions" + ext)).getMainTask();
     
     DebugInfoFrame frame = DebugInfoStackFactory.createVirtualStackTrace(task);
     Subprogram subprogram = frame.getSubprogram();
     assertNotNull(subprogram);
   }
   
-  public void testFrameAdjustedAddress ()
+  public void testFrameAdjustedAddress()
+  {
+    frameAdjustedAddress("");
+  }
+
+  public void testFrameAdjustedAddressNoDebug()
+  {
+    frameAdjustedAddress("-nodebug");
+  }
+
+  public void testFrameAdjustedAddressNoEH()
+  {
+    frameAdjustedAddress("-noeh");
+  }
+
+  public void frameAdjustedAddress(String ext)
   {
     if(unresolved(4676))
         return;
 
-    Task task = (new DaemonBlockedAtSignal("funit-stacks-exit")).getMainTask();
+    Task task = (new DaemonBlockedAtSignal("funit-stacks-exit" + ext)).getMainTask();
     
     Frame frame = StackFactory.createFrame(task);
     StringWriter stringWriter = new StringWriter();
@@ -116,10 +161,25 @@ public class TestFrameDebugInfo
     
   }
   
-  public void testFrameScopes ()
+  public void testFrameScopes()
   {
+    frameScopes("");
+  }
 
-      Task task = (new DaemonBlockedAtSignal("funit-scopes")).getMainTask();
+  public void testFrameScopesNoDebug()
+  {
+    frameScopes("-nodebug");
+  }
+
+  public void testFrameScopesNoEH()
+  {
+    frameScopes("-noeh");
+  }
+
+  public void frameScopes(String ext)
+  {
+
+      Task task = (new DaemonBlockedAtSignal("funit-scopes" + ext)).getMainTask();
     
     Frame frame = StackFactory.createFrame(task);
     
@@ -135,10 +195,25 @@ public class TestFrameDebugInfo
     
   }
   
-  public void testDebugInfoFrameScopes ()
+  public void testDebugInfoFrameScopes()
   {
+    debugInfoFrameScopes("");
+  }
 
-      Task task = (new DaemonBlockedAtSignal("funit-scopes")).getMainTask();
+  public void testDebugInfoFrameScopesNoDebug()
+  {
+    debugInfoFrameScopes("-nodebug");
+  }
+
+  public void testDebugInfoFrameScopesNoEH()
+  {
+    debugInfoFrameScopes("-noeh");
+  }
+
+  public void debugInfoFrameScopes(String ext)
+  {
+
+      Task task = (new DaemonBlockedAtSignal("funit-scopes" + ext)).getMainTask();
     DebugInfoFrame frame = DebugInfoStackFactory.createDebugInfoStackTrace(task);
     
     Scope scope1 = frame.getScopes();
@@ -151,10 +226,25 @@ public class TestFrameDebugInfo
     
   }
   
-  public void testFrameScopesWorkAround ()
+  public void testFrameScopesWorkAround()
+  {
+    frameScopesWorkAround("");
+  }
+
+  public void testFrameScopesWorkAroundNoDebug()
+  {
+    frameScopesWorkAround("-nodebug");
+  }
+
+  public void testFrameScopesWorkAroundNoEH()
+  {
+    frameScopesWorkAround("-noeh");
+  }
+
+  public void frameScopesWorkAround(String ext)
   {
     
-      Task task = (new DaemonBlockedAtSignal("funit-scopes-workaround")).getMainTask();
+      Task task = (new DaemonBlockedAtSignal("funit-scopes-workaround" + ext)).getMainTask();
     Frame frame = StackFactory.createFrame(task);
     
     Dwfl dwfl = DwflCache.getDwfl(task);
@@ -170,10 +260,25 @@ public class TestFrameDebugInfo
     
   }
   
-  public void testGetInlinedSubroutines ()
+  public void testGetInlinedSubroutines()
+  {
+    getInlinedSubroutines("");
+  }
+
+  public void testGetInlinedSubroutinesNoDebug()
+  {
+    getInlinedSubroutines("-nodebug");
+  }
+
+  public void testGetInlinedSubroutinesNoEH()
+  {
+    getInlinedSubroutines("-noeh");
+  }
+
+  public void getInlinedSubroutines(String ext)
   {
     
-      Task task = (new DaemonBlockedAtSignal("funit-stack-inlined")).getMainTask();
+      Task task = (new DaemonBlockedAtSignal("funit-stack-inlined" + ext)).getMainTask();
     DebugInfoFrame frame = DebugInfoStackFactory.createDebugInfoStackTrace(task);
     
     LinkedList inlinedSubprograms =  frame.getInlinedSubprograms();
@@ -182,10 +287,25 @@ public class TestFrameDebugInfo
     
   }
   
-  public void testVirtualStackTrace ()
+  public void testVirtualStackTrace()
+  {
+    virtualStackTrace("");
+  }
+
+  public void testVirtualStackTraceNoDebug()
+  {
+    virtualStackTrace("-nodebug");
+  }
+
+  public void testVirtualStackTraceNoEH()
+  {
+    virtualStackTrace("-noeh");
+  }
+
+  public void virtualStackTrace(String ext)
   {
     
-      Task task = (new DaemonBlockedAtSignal("funit-stack-inlined")).getMainTask();
+      Task task = (new DaemonBlockedAtSignal("funit-stack-inlined" + ext)).getMainTask();
     StringWriter stringWriter = new StringWriter();
     
     DebugInfoStackFactory.printVirtualTaskStackTrace(new PrintWriter(stringWriter), task,0, true, true, true);
@@ -197,13 +317,28 @@ public class TestFrameDebugInfo
     assertTrue("contains main", stringWriter.getBuffer().toString().contains("main"));
   }
   
+  public void testInlinedFunctionDerailment()
+  {
+    inlinedFunctionDerailment("");
+  }
+
+  public void testInlinedFunctionDerailmentNoDebug()
+  {
+    inlinedFunctionDerailment("-nodebug");
+  }
+
+  public void testInlinedFunctionDerailmentNoEH()
+  {
+    inlinedFunctionDerailment("-noeh");
+  }
+
   // test that a Subprogram can be retrieved for a function even
   // if the call stack contains calls to inlined functions inner
   // to it.
-  public void testInlinedFunctionDerailment ()
+  public void inlinedFunctionDerailment(String ext)
   {
   
-      Task task = (new DaemonBlockedAtSignal("funit-stack-inlined")).getMainTask();
+      Task task = (new DaemonBlockedAtSignal("funit-stack-inlined" + ext)).getMainTask();
     
     DebugInfoFrame frame = DebugInfoStackFactory.createVirtualStackTrace(task);
     Subprogram subprogram = null;
@@ -223,7 +358,22 @@ public class TestFrameDebugInfo
   
   public void testValues() throws NameNotFoundException
   {
-      Task task = (new DaemonBlockedAtSignal("funit-stacks-values")).getMainTask();
+    values("");
+  }
+
+  public void testValuesNoDebug() throws NameNotFoundException
+  {
+    values("-nodebug");
+  }
+
+  public void testValuesNoEH() throws NameNotFoundException
+  {
+    values("-noeh");
+  }
+
+  public void values(String ext) throws NameNotFoundException
+  {
+    Task task = (new DaemonBlockedAtSignal("funit-stacks-values" + ext)).getMainTask();
     Subprogram subprogram;
     DebugInfoFrame frame;
     Variable variable;
@@ -282,8 +432,24 @@ public class TestFrameDebugInfo
       
   }
   
-  public void testLineNumbers(){
-      Task task = (new DaemonBlockedAtSignal("funit-stacks-linenum")).getMainTask();
+  public void testLineNumbers()
+  {
+    lineNumbers("");
+  }
+
+  public void testLineNumbersNoDebug()
+  {
+    lineNumbers("-nodebug");
+  }
+
+  public void testLineNumbersNoEH()
+  {
+    lineNumbers("-noeh");
+  }
+
+  public void lineNumbers(String ext)
+  {
+      Task task = (new DaemonBlockedAtSignal("funit-stacks-linenum" + ext)).getMainTask();
       
       Subprogram subprogram;
       DebugInfoFrame frame;
@@ -333,9 +499,25 @@ public class TestFrameDebugInfo
       assertEquals("line number", variable.getLineNumber(), 10);
   }
 
-  public void testThatArtificialParametersAreIgnored() {
+  public void testThatArtificialParametersAreIgnored()
+  {
+    artificialParametersAreIgnored("");
+  }
+
+  public void testThatArtificialParametersAreIgnoredNoDebug()
+  {
+    artificialParametersAreIgnored("-nodebug");
+  }
+
+  public void testThatArtificialParametersAreIgnoredNoEH()
+  {
+    artificialParametersAreIgnored("-noeh");
+  }
+
+  public void artificialParametersAreIgnored(String ext)
+  {
 
-	Task task = (new DaemonBlockedAtSignal("funit-cpp-scopes-class")).getMainTask();
+	Task task = (new DaemonBlockedAtSignal("funit-cpp-scopes-class" + ext)).getMainTask();
 	      
 	DebugInfoFrame frame = DebugInfoStackFactory
 		.createVirtualStackTrace(task);

                 reply	other threads:[~2008-01-23 14:33 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1201098751.3092.17.camel@dijkstra.wildebeest.org \
    --to=mark@klomp.org \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).