50 lines
2.0 KiB
Diff
50 lines
2.0 KiB
Diff
https://bugzilla.redhat.com/show_bug.cgi?id=533176#c4
|
|
|
|
I find it a bug in DWARF and gdb behaves correctly according to it. From the
|
|
current DWARF's point of view the is a function call which you skip by "next".
|
|
|
|
If you hide any /usr/lib/debug such as using:
|
|
gdb -nx -ex 'set debug-file-directory /qwe' -ex 'file ./tpcommon_gfortran44'
|
|
and use "step" command instead of "next" there it will work.
|
|
(You need to hide debuginfo from libgomp as you would step into libgomp sources
|
|
to maintain the threads for execution.)
|
|
|
|
There should be some DWARF extension for it, currently tried to detect
|
|
substring ".omp_fn." as this function is called "MAIN__.omp_fn.0" and do not
|
|
consider such sub-function as a skippable by "next".
|
|
|
|
Another problem is that with "set scheduler-locking" being "off" (default
|
|
upstream) or "step" (default in F/RHEL) the simultaneous execution of the
|
|
threads is inconvenient. Setting it to "on" will lockup the debugging as the
|
|
threads need to get synchronized at some point. This is a more general
|
|
debugging problem of GOMP outside of the scope of this Bug.
|
|
|
|
diff --git a/gdb/infrun.c b/gdb/infrun.c
|
|
--- a/gdb/infrun.c
|
|
+++ b/gdb/infrun.c
|
|
@@ -6695,6 +6695,16 @@ process_event_stop_test (struct execution_control_state *ecs)
|
|
|
|
if (ecs->event_thread->control.step_over_calls == STEP_OVER_ALL)
|
|
{
|
|
+ struct symbol *stop_fn = find_pc_function (stop_pc);
|
|
+ struct minimal_symbol *stopf = lookup_minimal_symbol_by_pc (stop_pc).minsym;
|
|
+
|
|
+ if ((stop_fn == NULL
|
|
+ || strstr (SYMBOL_LINKAGE_NAME (stop_fn), ".omp_fn.") == NULL)
|
|
+ /* gcc-4.7.2-9.fc19.x86_64 uses a new format. */
|
|
+ && (stopf == NULL
|
|
+ || strstr (MSYMBOL_LINKAGE_NAME (stopf), "._omp_fn.") == NULL))
|
|
+{ /* ".omp_fn." */
|
|
+
|
|
/* We're doing a "next".
|
|
|
|
Normal (forward) execution: set a breakpoint at the
|
|
@@ -6728,6 +6738,7 @@ process_event_stop_test (struct execution_control_state *ecs)
|
|
|
|
keep_going (ecs);
|
|
return;
|
|
+} /* ".omp_fn." */
|
|
}
|
|
|
|
/* If we are in a function call trampoline (a stub between the
|