binutils-gdb/gdb/testsuite/gdb.threads
Pedro Alves 75acb4867d Improve alignment of "info threads" output, align "Target Id" column
It's long annoyed me that "info threads"'s columns are misaligned.

Particularly the "Target Id" column's content is usually longer than
the specified column width, so the table ends up with the "Frame"
column misaligned.  For example, currently we get this:

 (gdb) info threads
   Id   Target Id         Frame
   1    Thread 0x7ffff7fb5740 (LWP 9056) "threads" 0x00007ffff7bc28ad in __pthread_join (threadid=140737345763072, thread_return=0x7fffffffd3e8) at pthread_join.c:90
   2    Thread 0x7ffff7803700 (LWP 9060) "function0" thread_function0 (arg=0x0) at threads.c:90
 * 3    Thread 0x7ffff7002700 (LWP 9061) "threads" thread_function1 (arg=0x1) at threads.c:106

The fact that the "Frame" heading is in a weird spot is particularly
annoying.

This commit turns the above into into this:

 (gdb) info threads
   Id   Target Id                                    Frame
   1    Thread 0x7ffff7fb5740 (LWP 7548) "threads"   0x00007ffff7bc28ad in __pthread_join (threadid=140737345763072, thread_return=0x7fffffffd3e8) at pthread_join.c:90
   2    Thread 0x7ffff7803700 (LWP 7555) "function0" thread_function0 (arg=0x0) at threads.c:91
 * 3    Thread 0x7ffff7002700 (LWP 7557) "threads"   thread_function1 (arg=0x1) at threads.c:104

It does that by computing the max width of the "Target Id" column and
using that as column width when creating the table.

This results in calling target_pid_to_str / target_extra_thread_info /
target_thread_name twice for each thread, but I think that it doesn't
matter in practice performance-wise, because the remote target caches
the info, and with native targets it shouldn't be noticeable.  It
could matter if we have many threads (say, thousands), but then "info
threads" is practically useless in such a scenario anyway -- better
thread filtering and aggregation would be necessary.

(Note: I have an old branch somewhere where I attempted at making
gdb's "info threads"-like tables follow a model/view design, so that a
general framework took care of issues like these, but it's incomplete
and a much bigger change.  This patch doesn't prevent going in that
direction in the future, of course.)

gdb/ChangeLog:
2018-06-29  Pedro Alves  <palves@redhat.com>

	* thread.c (thread_target_id_str): New, factored out from ...
	(print_thread_info_1): ... here.  Use it to compute the max
	"Target Id" column width.

gdb/testsuite/ChangeLog:
2018-06-29  Pedro Alves  <palves@redhat.com>

	* gdb.threads/names.exp: Adjust expected "info threads" output.
2018-06-29 20:47:15 +01:00
..
attach-into-signal.c
attach-into-signal.exp
attach-many-short-lived-threads.c
attach-many-short-lived-threads.exp
attach-slow-waitpid.c gdb: Don't drop SIGSTOP during stop_all_threads 2018-06-16 01:03:57 +01:00
attach-slow-waitpid.exp gdb: Don't drop SIGSTOP during stop_all_threads 2018-06-16 01:03:57 +01:00
attach-stopped.c
attach-stopped.exp
bp_in_thread.c
bp_in_thread.exp
break-while-running.c
break-while-running.exp
check-libthread-db.c
check-libthread-db.exp
clone-attach-detach.c
clone-attach-detach.exp
clone-new-thread-event.c
clone-new-thread-event.exp
clone-thread_db.c
clone-thread_db.exp
continue-pending-after-query.c
continue-pending-after-query.exp
continue-pending-status.c
continue-pending-status.exp
corethreads.c
corethreads.exp
create-fail.c
create-fail.exp
current-lwp-dead.c
current-lwp-dead.exp
dlopen-libpthread-lib.c
dlopen-libpthread.c
dlopen-libpthread.exp
execl1.c
execl.c
execl.exp
fork-child-threads.c
fork-child-threads.exp
fork-plus-threads.c
fork-plus-threads.exp
fork-thread-pending.c
fork-thread-pending.exp
forking-threads-plus-breakpoint.c
forking-threads-plus-breakpoint.exp
gcore-stale-thread.c
gcore-stale-thread.exp
gcore-thread.exp
hand-call-in-threads.c
hand-call-in-threads.exp
hand-call-new-thread.c
hand-call-new-thread.exp
ia64-sigill.c
ia64-sigill.exp
info-threads-cur-sal-2.c
info-threads-cur-sal.c
info-threads-cur-sal.exp
interrupt-while-step-over.c
interrupt-while-step-over.exp
interrupted-hand-call.c
interrupted-hand-call.exp
kill.c
kill.exp
killed.c
killed.exp
leader-exit.c
leader-exit.exp
linux-dp.c
linux-dp.exp
local-watch-wrong-thread.c
local-watch-wrong-thread.exp
manythreads.c
manythreads.exp
multi-create-ns-info-thr.exp
multi-create.c
multi-create.exp
multiple-step-overs.c
multiple-step-overs.exp
multiple-successive-infcall.c
multiple-successive-infcall.exp gdb: Mark async event handler when event is already pending 2018-06-12 21:15:33 +01:00
names.c
names.exp Improve alignment of "info threads" output, align "Target Id" column 2018-06-29 20:47:15 +01:00
next-bp-other-thread.c
next-bp-other-thread.exp
next-while-other-thread-longjmps.c
next-while-other-thread-longjmps.exp
no-unwaited-for-left.c
no-unwaited-for-left.exp
non-ldr-exc-1.c
non-ldr-exc-1.exp
non-ldr-exc-2.c
non-ldr-exc-2.exp
non-ldr-exc-3.c
non-ldr-exc-3.exp
non-ldr-exc-4.c
non-ldr-exc-4.exp
non-ldr-exit.c
non-ldr-exit.exp
non-stop-fair-events.c
non-stop-fair-events.exp
pending-step.c
pending-step.exp
print-threads.c
print-threads.exp
process-dies-while-detaching.c
process-dies-while-detaching.exp
process-dies-while-handling-bp.c
process-dies-while-handling-bp.exp
pthread_cond_wait.c
pthread_cond_wait.exp
pthreads.c
pthreads.exp
queue-signal.c
queue-signal.exp
reconnect-signal.c
reconnect-signal.exp
schedlock.c
schedlock.exp
siginfo-threads.c
siginfo-threads.exp
signal-command-handle-nopass.c
signal-command-handle-nopass.exp
signal-command-multiple-signals-pending.c
signal-command-multiple-signals-pending.exp
signal-delivered-right-thread.c
signal-delivered-right-thread.exp
signal-sigtrap.c
signal-sigtrap.exp
signal-while-stepping-over-bp-other-thread.c
signal-while-stepping-over-bp-other-thread.exp
sigstep-threads.c
sigstep-threads.exp
sigthread.c
sigthread.exp
slow-waitpid.c gdb: Don't drop SIGSTOP during stop_all_threads 2018-06-16 01:03:57 +01:00
staticthreads.c
staticthreads.exp
step-bg-decr-pc-switch-thread.c
step-bg-decr-pc-switch-thread.exp
step-over-lands-on-breakpoint.c
step-over-lands-on-breakpoint.exp
step-over-trips-on-watchpoint.c
step-over-trips-on-watchpoint.exp
stepi-random-signal.c
stepi-random-signal.exp
switch-threads.c
switch-threads.exp
thread_check.c
thread_check.exp
thread_events.c
thread_events.exp
thread-execl.c
thread-execl.exp
thread-find.exp
thread-specific-bp.c
thread-specific-bp.exp
thread-specific.c
thread-specific.exp
thread-unwindonsignal.exp
threadapply.c
threadapply.exp
threxit-hop-specific.c
threxit-hop-specific.exp
tid-reuse.c
tid-reuse.exp
tls2.c
tls-core.c
tls-core.exp
tls-main.c
tls-nodebug-pie.c
tls-nodebug-pie.exp
tls-nodebug.c
tls-nodebug.exp
tls-shared.c
tls-shared.exp
tls-so_extern_main.c
tls-so_extern.c
tls-so_extern.exp
tls-var-main.c
tls-var.c
tls-var.exp
tls.c
tls.exp
watchpoint-fork-child.c
watchpoint-fork-mt.c
watchpoint-fork-parent.c
watchpoint-fork-st.c
watchpoint-fork.exp
watchpoint-fork.h
watchthreads2.c
watchthreads2.exp
watchthreads-reorder.c
watchthreads-reorder.exp
watchthreads.c
watchthreads.exp
wp-replication.c
wp-replication.exp