Test program for getting all frames for all threads.

This commit is contained in:
Ernie Pasveer
2025-12-23 14:46:39 -06:00
parent 01df7095c9
commit c73637f7b4
8 changed files with 158 additions and 14 deletions
+1
View File
@@ -87,6 +87,7 @@
<file>resources/mi-python/MICheckpoint.py</file>
<file>resources/mi-python/MICatchpoint.py</file>
<file>resources/mi-python/MIObjectiveC.py</file>
<file>resources/mi-python/MIFrames.py</file>
</qresource>
</RCC>
+1
View File
@@ -1,2 +1,3 @@
hellothreads2
Digraph.*
DirectedGraph.*
+1 -1
View File
@@ -17,5 +17,5 @@ install:
# This rule tells make to delete hellothreads2 and hellothreads2.o
.PHONY: clean
clean:
rm -f hellothreads2 hellothreads2.o
rm -f hellothreads2 hellothreads2.o Digraph.*
+119
View File
@@ -0,0 +1,119 @@
This test plays around with the "parallel-stacks" program that generates a PDF file
that contains a graph of threads, including their trace back.
Run the test program.
$ cd /nas/erniep/Development/seer/tests/hellothreads2
$ seergdb --project project.seer
After continuing and breaking at the first breakpoint that 'joins', run this command
in Seer's gdb command input.
pipe thread apply all bt | python3 parallel-stacks.py
It will run the script and view the parallel-stacks pdf.
Parsed output from gdb from the 'pipe' command.
$ python3 parallel-stacks.py -p 22900
Thread 10
level: 0, address: '0x00007f84094f0f05', function: 'clock_nanosleep@GLIBC_2.2.5', parameters: '', filename: '/lib64/libc.so.6'
level: 1, address: '0x00007f8409503b13', function: 'nanosleep', parameters: '', filename: '/lib64/libc.so.6'
level: 2, address: '0x00007f840951517a', function: 'sleep', parameters: '', filename: '/lib64/libc.so.6'
level: 3, address: '0x0000562f5846609f', function: 'operator()', parameters: '__closure=0x562f8e11c1c8, x=3', filename: 'hellothreads2.cpp:55'
level: 4, address: '0x0000562f584667ec', function: 'std::__invoke_impl<void, main()::<lambda(int)>, int>(std::__invoke_other, struct {...} &&)', parameters: '__f=...', filename: '/usr/include/c++/13/bits/invoke.h:61'
level: 5, address: '0x0000562f58466785', function: 'std::__invoke<main()::<lambda(int)>, int>(struct {...} &&)', parameters: '__fn=...', filename: '/usr/include/c++/13/bits/invoke.h:96'
level: 6, address: '0x0000562f584666f5', function: 'std::thread::_Invoker<std::tuple<main()::<lambda(int)>, int> >::_M_invoke<0, 1>(std::_Index_tuple<0, 1>)', parameters: 'this=0x562f8e11c1c8', filename: '/usr/include/c++/13/bits/std_thread.h:292'
level: 7, address: '0x0000562f584666ae', function: 'std::thread::_Invoker<std::tuple<main()::<lambda(int)>, int> >::operator()(void)', parameters: 'this=0x562f8e11c1c8', filename: '/usr/include/c++/13/bits/std_thread.h:299'
level: 8, address: '0x0000562f58466692', function: 'std::thread::_State_impl<std::thread::_Invoker<std::tuple<main()::<lambda(int)>, int> > >::_M_run(void)', parameters: 'this=0x562f8e11c1c0', filename: '/usr/include/c++/13/bits/std_thread.h:244'
level: 9, address: '0x00007f84098e8964', function: '??', parameters: '', filename: '/usr/local/lib64/libstdc++.so.6'
level: 10, address: '0x00007f84094a6f6c', function: 'start_thread', parameters: '', filename: '/lib64/libc.so.6'
level: 11, address: '0x00007f840952e388', function: 'clone3', parameters: '', filename: '/lib64/libc.so.6'
Thread 9
level: 0, address: '0x00007f84094f0f05', function: 'clock_nanosleep@GLIBC_2.2.5', parameters: '', filename: '/lib64/libc.so.6'
level: 1, address: '0x00007f8409503b13', function: 'nanosleep', parameters: '', filename: '/lib64/libc.so.6'
level: 2, address: '0x00007f840951517a', function: 'sleep', parameters: '', filename: '/lib64/libc.so.6'
level: 3, address: '0x0000562f584668fb', function: 'thread_obj::operator()', parameters: 'this=0x562f8e11c068, x=3', filename: 'hellothreads2.cpp:25'
level: 4, address: '0x0000562f58467490', function: 'std::__invoke_impl<void, thread_obj, int>', parameters: '__f=...', filename: '/usr/include/c++/13/bits/invoke.h:61'
level: 5, address: '0x0000562f5846738d', function: 'std::__invoke<thread_obj, int>', parameters: '__fn=...', filename: '/usr/include/c++/13/bits/invoke.h:96'
level: 6, address: '0x0000562f584672b3', function: 'std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul>', parameters: 'this=0x562f8e11c068', filename: '/usr/include/c++/13/bits/std_thread.h:292'
level: 7, address: '0x0000562f58467250', function: 'std::thread::_Invoker<std::tuple<thread_obj, int> >::operator()', parameters: 'this=0x562f8e11c068', filename: '/usr/include/c++/13/bits/std_thread.h:299'
level: 8, address: '0x0000562f58467214', function: 'std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run', parameters: 'this=0x562f8e11c060', filename: '/usr/include/c++/13/bits/std_thread.h:244'
level: 9, address: '0x00007f84098e8964', function: '??', parameters: '', filename: '/usr/local/lib64/libstdc++.so.6'
level: 10, address: '0x00007f84094a6f6c', function: 'start_thread', parameters: '', filename: '/lib64/libc.so.6'
level: 11, address: '0x00007f840952e388', function: 'clone3', parameters: '', filename: '/lib64/libc.so.6'
Output from '-thread-info' command doesn't cut it. Only the first frame.
^done,threads=[
{id="1",target-id="Thread 0x7ffff7e7d740 (LWP 23678)",name="hellothreads2",
frame={level="0",addr="0x00005555555551f6",func="main",args=[],file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="64",arch="i386:x86-64"},state="stopped",core="1"},
{id="2",target-id="Thread 0x7ffff77ff6c0 (LWP 23681)",name="hellothreads2",
frame={level="0",addr="0x00007ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",args=[],from="/lib64/libc.so.6",arch="i386:x86-64"},state="stopped",core="3"},
Output from 'thread apply all bt'
thread apply all bt
Thread 9 (Thread 0x7ffff3ff86c0 (LWP 24364) "hellothreads2"):
#0 0x00007ffff78f0f05 in clock_nanosleep@GLIBC_2.2.5 () from /lib64/libc.so.6
#1 0x00007ffff7903b13 in nanosleep () from /lib64/libc.so.6
#2 0x00007ffff791517a in sleep () from /lib64/libc.so.6
#3 0x00005555555558fb in thread_obj::operator() (this=0x55555556d068, x=3) at hellothreads2.cpp:25
#4 0x0000555555556490 in std::__invoke_impl<void, thread_obj, int> (__f=...) at /usr/include/c++/13/bits/invoke.h:61
#5 0x000055555555638d in std::__invoke<thread_obj, int> (__fn=...) at /usr/include/c++/13/bits/invoke.h:96
#6 0x00005555555562b3 in std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul> (this=0x55555556d068) at /usr/include/c++/13/bits/std_thread.h:292
#7 0x0000555555556250 in std::thread::_Invoker<std::tuple<thread_obj, int> >::operator() (this=0x55555556d068) at /usr/include/c++/13/bits/std_thread.h:299
#8 0x0000555555556214 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run (this=0x55555556d060) at /usr/include/c++/13/bits/std_thread.h:244
#9 0x00007ffff7ce8964 in ?? () from /usr/local/lib64/libstdc++.so.6
#10 0x00007ffff78a6f6c in start_thread () from /lib64/libc.so.6
#11 0x00007ffff792e388 in clone3 () from /lib64/libc.so.6
Thread 8 (Thread 0x7ffff47f96c0 (LWP 24363) "hellothreads2"):
#0 0x00007ffff78f0f05 in clock_nanosleep@GLIBC_2.2.5 () from /lib64/libc.so.6
#1 0x00007ffff7903b13 in nanosleep () from /lib64/libc.so.6
#2 0x00007ffff791517a in sleep () from /lib64/libc.so.6
#3 0x00005555555558fb in thread_obj::operator() (this=0x55555556cf08, x=3) at hellothreads2.cpp:25
#4 0x0000555555556490 in std::__invoke_impl<void, thread_obj, int> (__f=...) at /usr/include/c++/13/bits/invoke.h:61
#5 0x000055555555638d in std::__invoke<thread_obj, int> (__fn=...) at /usr/include/c++/13/bits/invoke.h:96
#6 0x00005555555562b3 in std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul> (this=0x55555556cf08) at /usr/include/c++/13/bits/std_thread.h:292
#7 0x0000555555556250 in std::thread::_Invoker<std::tuple<thread_obj, int> >::operator() (this=0x55555556cf08) at /usr/include/c++/13/bits/std_thread.h:299
#8 0x0000555555556214 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run (this=0x55555556cf00) at /usr/include/c++/13/bits/std_thread.h:244
#9 0x00007ffff7ce8964 in ?? () from /usr/local/lib64/libstdc++.so.6
#10 0x00007ffff78a6f6c in start_thread () from /lib64/libc.so.6
#11 0x00007ffff792e388 in clone3 () from /lib64/libc.so.6
Output from 'frames-list'
^done,threads=[
{id="10",target-id="(28429, 28440, 0)",name="hellothreads2",state="stopped",current="0",frames=[
{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},
{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},
{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},
{level="3",addr="0x555555555089",func="operator()",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="53",type="normal"},
{level="4",addr="0x5555555557ec",func="std::__invoke_impl<void, main()::<lambda(int)>, int>(std::__invoke_other, struct {...} &&)",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},
{level="5",addr="0x555555555785",func="std::__invoke<main()::<lambda(int)>, int>(struct {...} &&)",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},
{level="6",addr="0x5555555556f5",func="std::thread::_Invoker<std::tuple<main()::<lambda(int)>, int> >::_M_invoke<0, 1>(std::_Index_tuple<0, 1>)",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},
{level="7",addr="0x5555555556ae",func="std::thread::_Invoker<std::tuple<main()::<lambda(int)>, int> >::operator()(void)",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},
{level="8",addr="0x555555555692",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<main()::<lambda(int)>, int> > >::_M_run(void)",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},
{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},
{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},
{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="8",target-id="(28429, 28438, 0)",name="hellothreads2",state="stopped",current="0",frames=[{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="3",addr="0x5555555558fb",func="thread_obj::operator()",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="25",type="normal"},{level="4",addr="0x555555556490",func="std::__invoke_impl<void, thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},{level="5",addr="0x55555555638d",func="std::__invoke<thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},{level="6",addr="0x5555555562b3",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul>",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},{level="7",addr="0x555555556250",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::operator()",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},{level="8",addr="0x555555556214",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="7",target-id="(28429, 28437, 0)",name="hellothreads2",state="stopped",current="0",frames=[{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="3",addr="0x5555555558fb",func="thread_obj::operator()",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="25",type="normal"},{level="4",addr="0x555555556490",func="std::__invoke_impl<void, thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},{level="5",addr="0x55555555638d",func="std::__invoke<thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},{level="6",addr="0x5555555562b3",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul>",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},{level="7",addr="0x555555556250",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::operator()",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},{level="8",addr="0x555555556214",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="6",target-id="(28429, 28436, 0)",name="hellothreads2",state="stopped",current="0",frames=[{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="3",addr="0x5555555558fb",func="thread_obj::operator()",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="25",type="normal"},{level="4",addr="0x555555556490",func="std::__invoke_impl<void, thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},{level="5",addr="0x55555555638d",func="std::__invoke<thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},{level="6",addr="0x5555555562b3",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul>",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},{level="7",addr="0x555555556250",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::operator()",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},{level="8",addr="0x555555556214",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="5",target-id="(28429, 28435, 0)",name="hellothreads2",state="stopped",current="0",frames=[{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="3",addr="0x5555555558fb",func="thread_obj::operator()",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="25",type="normal"},{level="4",addr="0x555555556490",func="std::__invoke_impl<void, thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},{level="5",addr="0x55555555638d",func="std::__invoke<thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},{level="6",addr="0x5555555562b3",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul>",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},{level="7",addr="0x555555556250",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::operator()",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},{level="8",addr="0x555555556214",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="9",target-id="(28429, 28439, 0)",name="hellothreads2",state="stopped",current="0",frames=[{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="3",addr="0x5555555558fb",func="thread_obj::operator()",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="25",type="normal"},{level="4",addr="0x555555556490",func="std::__invoke_impl<void, thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},{level="5",addr="0x55555555638d",func="std::__invoke<thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},{level="6",addr="0x5555555562b3",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul>",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},{level="7",addr="0x555555556250",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::operator()",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},{level="8",addr="0x555555556214",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="4",target-id="(28429, 28434, 0)",name="hellothreads2",state="stopped",current="0",frames=[{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="3",addr="0x5555555558fb",func="thread_obj::operator()",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="25",type="normal"},{level="4",addr="0x555555556490",func="std::__invoke_impl<void, thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},{level="5",addr="0x55555555638d",func="std::__invoke<thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},{level="6",addr="0x5555555562b3",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul>",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},{level="7",addr="0x555555556250",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::operator()",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},{level="8",addr="0x555555556214",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="3",target-id="(28429, 28433, 0)",name="hellothreads2",state="stopped",current="0",frames=[{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="3",addr="0x5555555558fb",func="thread_obj::operator()",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="25",type="normal"},{level="4",addr="0x555555556490",func="std::__invoke_impl<void, thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},{level="5",addr="0x55555555638d",func="std::__invoke<thread_obj, int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},{level="6",addr="0x5555555562b3",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::_M_invoke<0ul, 1ul>",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},{level="7",addr="0x555555556250",func="std::thread::_Invoker<std::tuple<thread_obj, int> >::operator()",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},{level="8",addr="0x555555556214",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<thread_obj, int> > >::_M_run",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="2",target-id="(28429, 28432, 0)",name="hellothreads2",state="stopped",current="0",frames=[{level="0",addr="0x7ffff78f0f05",func="clock_nanosleep@GLIBC_2.2.5",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="1",addr="0x7ffff7903b13",func="nanosleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="2",addr="0x7ffff791517a",func="sleep",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="3",addr="0x555555555023",func="foo",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="14",type="normal"},{level="4",addr="0x5555555564f1",func="std::__invoke_impl<void, void (*)(int), int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="61",type="normal"},{level="5",addr="0x55555555641d",func="std::__invoke<void (*)(int), int>",arch="i386:x86-64",file="/usr/include/c++/13/bits/invoke.h",fullname="/usr/include/c++/13/bits/invoke.h",line="96",type="normal"},{level="6",addr="0x5555555562fd",func="std::thread::_Invoker<std::tuple<void (*)(int), int> >::_M_invoke<0ul, 1ul>",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="292",type="normal"},{level="7",addr="0x55555555626c",func="std::thread::_Invoker<std::tuple<void (*)(int), int> >::operator()",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="299",type="normal"},{level="8",addr="0x555555556234",func="std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(int), int> > >::_M_run",arch="i386:x86-64",file="/usr/include/c++/13/bits/std_thread.h",fullname="/usr/include/c++/13/bits/std_thread.h",line="244",type="normal"},{level="9",addr="0x7ffff7ce8964",func="??",arch="i386:x86-64",from="/usr/local/lib64/libstdc++.so.6",type="normal"},{level="10",addr="0x7ffff78a6f6c",func="start_thread",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"},{level="11",addr="0x7ffff792e388",func="clone3",arch="i386:x86-64",from="/lib64/libc.so.6",type="normal"}]},
{id="1",target-id="(28429, 28429, 0)",name="hellothreads2",state="stopped",current="1",frames=[{level="0",addr="0x5555555551f6",func="main",arch="i386:x86-64",file="hellothreads2.cpp",fullname="/nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp",line="64",type="normal"}]}
],
current_thread_id="1",
current_frame_level="0",
total_threads="10",
total_frames="109"
+1
View File
@@ -0,0 +1 @@
break -source /nas/erniep/Development/seer/tests/hellothreads2/hellothreads2.cpp -line 64
+3 -3
View File
@@ -11,7 +11,7 @@ void foo(int Z) {
for (int i = 0; i < Z; i++) {
std::cout << "Thread using function pointer as callable" << std::endl;
sleep(2);
sleep(20);
}
sleep(5);
}
@@ -22,9 +22,9 @@ class thread_obj {
void operator()(int x) {
for (int i = 0; i < x; i++) {
std::cout << "Thread using function object as callable" << std::endl;
sleep(3);
sleep(30);
}
sleep(1);
sleep(5);
}
};
+8 -10
View File
@@ -109,10 +109,10 @@ def print_parallel_stack(node, first_node=True, indent='', last_node=False):
function_indent = indent + ('' if last_node else '') + base_indent
if first_node:
thread_count = len(node.threads)
print(before_thread_indent)
print('{}Threads: {}'.format(thread_indent, thread_count))
print(before_thread_indent, file=sys.stderr)
print('{}Threads: {}'.format(thread_indent, thread_count, file=sys.stderr))
if node.function:
print('{}{}'.format(function_indent, node.function))
print('{}{}'.format(function_indent, node.function, file=sys.stderr))
if len(node.nodes) == 1:
print_parallel_stack(node.nodes[0], False, indent, last_node)
return
@@ -178,11 +178,9 @@ def get_graph(node):
def main():
arg_parser = argparse.ArgumentParser(description='Shows Parallel Stacks of a Process',
epilog='Data sources are a process, a log file or standard input.')
arg_parser = argparse.ArgumentParser(description='Shows Parallel Stacks of a Process', epilog='Data sources are a process, a log file or standard input.')
data_source_group = arg_parser.add_mutually_exclusive_group()
data_source_group.add_argument('-l', '--log_file', metavar='filename', help='a GDB log file with backtraces',
type=argparse.FileType('r'), default=sys.stdin)
data_source_group.add_argument('-l', '--log_file', metavar='filename', help='a GDB log file with backtraces', type=argparse.FileType('r'), default=sys.stdin)
data_source_group.add_argument('-p', '--pid', type=int, required=False, help='a process ID')
args = arg_parser.parse_args()
@@ -197,12 +195,12 @@ def main():
gdb_output = input_file.read().splitlines()
threads = parse_gdb_output(gdb_output)
for thread in threads:
print(thread)
print(thread, file=sys.stderr)
tree = get_parallel_stacks(threads)
print_parallel_stack(tree)
get_graph(tree).render(view=True)
#print(get_graph(tree).source)
get_graph(tree).render('DirectedGraph.gv', view=True, format='png')
print(get_graph(tree).source, file=sys.stderr)
if __name__ == "__main__":
+24
View File
@@ -0,0 +1,24 @@
{
"seerproject": {
"executable": "hellothreads2",
"postgdbcommands": [
""
],
"pregdbcommands": [
""
],
"startmode": {
"arguments": "",
"breakinfunction": false,
"breakinfunctionname": "",
"breakinmain": true,
"breakpointsfile": "/nas/erniep/Development/seer/tests/hellothreads2/breakpoints.seer",
"nobreak": false,
"nonstopmode": false,
"randomizestartaddress": false,
"showassemblytabmode": "auto"
},
"symbolfile": "",
"workingdirectory": ""
}
}