This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 2/2] Find the next matched trace file in 'tfile target'.


The previous patch exposes a bug in tfile target when finding a trace
frame.  Every time, GDB will scan tfile from the starting offset and
initialize trace frame number to zero.  When TYPE is not tfind_number,
it means GDB wants to find the *next* matched trace frame of current
one.  So we need to check the tfile trace frame number iterator is
greater than the current trace frame number (which means *next*).
This is mainly what this patch does.

Regression tested on x86_64-linux.

gdb:

2013-02-25  Yao Qi  <yao@codesourcery.com>

	* tracepoint.c (tfile_trace_find): Find the next matched trace
	frame.
---
 gdb/tracepoint.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index ca104aa..f7a3650 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -4324,22 +4324,34 @@ tfile_trace_find (enum trace_find_type type, int num,
 	  break;
 	case tfind_pc:
 	  tfaddr = tfile_get_traceframe_address (tframe_offset);
-	  if (tfaddr == addr1)
+	  if (tfaddr == addr1
+	      /* Looks for the next trace frame if matched.  */
+	      && (tfnum > traceframe_number
+		  || (tfnum == traceframe_number && tfnum == 0)))
 	    found = 1;
 	  break;
 	case tfind_tp:
 	  tp = get_tracepoint (num);
-	  if (tp && tpnum == tp->number_on_target)
+	  if (tp && tpnum == tp->number_on_target
+	      /* Looks for the next trace frame if matched.  */
+	      && (tfnum > traceframe_number
+		  || (tfnum == traceframe_number && tfnum == 0)))
 	    found = 1;
 	  break;
 	case tfind_range:
 	  tfaddr = tfile_get_traceframe_address (tframe_offset);
-	  if (addr1 <= tfaddr && tfaddr <= addr2)
+	  if (addr1 <= tfaddr && tfaddr <= addr2
+	      /* Looks for the next trace frame if matched.  */
+	      && (tfnum > traceframe_number
+		  || (tfnum == traceframe_number && tfnum == 0)))
 	    found = 1;
 	  break;
 	case tfind_outside:
 	  tfaddr = tfile_get_traceframe_address (tframe_offset);
-	  if (!(addr1 <= tfaddr && tfaddr <= addr2))
+	  if (!(addr1 <= tfaddr && tfaddr <= addr2)
+	      /* Looks for the next trace frame if matched.  */
+	      && (tfnum > traceframe_number
+		  || (tfnum == traceframe_number && tfnum == 0)))
 	    found = 1;
 	  break;
 	default:
-- 
1.7.7.6


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]