gprof2dot icon indicating copy to clipboard operation
gprof2dot copied to clipboard

Function names too long

Open benj5378 opened this issue 1 year ago • 4 comments

Logic have been added to truncate overly long function names

https://github.com/jrfonseca/gprof2dot/blob/6edec704a3c6242801ce8e8be9095e9cf0753493/gprof2dot.py#L3364-L3370

However, they still somehow end up in the dot file, causing graphviz to fail. It seems like only the labels are being truncated, and not the IDs. Here is an example

"__gnu_cxx::__normal_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long>*, std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long> > > >::operator-(long) const" -> "__gnu_cxx::__normal_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long>*, std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long> > > >::__normal_iterator(std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long>* const&)"teeeeeeeest [arrowsize="0.35", color="#0d0d73", fontcolor="#0d0d73", fontsize="10.00", label="0.00%\n2×", labeldistance="0.50", penwidth="0.50"];
	"__gnu_cxx::__normal_iterator<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > >*, std::vector<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > >, std::allocator<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > > > > >::difference_type __gnu_cxx::operator-<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > >*, std::vector<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > >, std::allocator<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > > > > >(__gnu_cxx::__normal_iterator<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > >*, std::vector<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > >, std::allocator<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > > > > > const&, __gnu_cxx::__normal_iterator<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > >*, std::vector<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > >, std::allocator<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long> >, std::pair<boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long>, boost::detail::out_edge_iter<__gnu_cxx::__normal_iterator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>*, std::vector<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property>, std::allocator<boost::detail::stored_edge_iter<unsigned long, std::_List_iterator<boost::list_edge<unsigned long, boost::no_property> >, boost::no_property> > > >, unsigned long, boost::detail::edge_desc_impl<boost::undirected_tag, unsigned long>, long> > > > > > > const&)" [color="#0d0d73", fontcolor="#ffffff", fontsize="10.00", label="Sketcher.so\n__gnu_cxx::__normal_iterator<std::pair<unsigned long, std::pair<boost::optional<boost::detail::edge…\n0.00%\n(0.00%)\n15×"];

benj5378 avatar Oct 02 '24 19:10 benj5378

It's a failure of C++ language that these monstrosities are even possible... how are humans even supposed to reason about this.

Doesn't the -s/--strip option help?

  -s, --strip           strip function parameters, template parameters, and
                        const modifiers from demangled C++ function names

jrfonseca avatar Oct 03 '24 20:10 jrfonseca

@jrfonseca as I remember, -s only worked for labels. These are IDs.

benj5378 avatar Oct 03 '24 22:10 benj5378

Could you provide an input that triggers this? If you don't want to share it publicly, please email it to jose dot r dot fonseca at gmail dot com.

jrfonseca avatar Oct 04 '24 15:10 jrfonseca

callgrind.out.102239.txt

$ gprof2dot --format=callgrind -n 0 -e 0 --output=out.dot -s callgrind.out.102239
$ dot -Tsvg out.dot -o graph.svg
Error: out.dot: syntax error in line 51790 scanning a quoted string (missing endquote? longer than 16384?)
String starting:"__gnu_cxx::__normal_iterator<std::pair<unsigned long, std::pair<boost::optional<

(remember -n 0 -e 0 to get the long function name)

@jrfonseca, note, that the --path doesn't work with Callgrind, but seems like you're already aware of this according to a code comment. However, I think I quickfixed this by adding function.filename = filename on line 2011; unsure if it covers all cases though.

benj5378 avatar Oct 04 '24 17:10 benj5378

@benj5378

I finally found some time to look and fix this. Your test case now works. Note however the output graph huge and dot takes an eternity to process it.

note, that the --path doesn't work with Callgrind, but seems like you're already aware of this according to a code comment. However, I think I quickfixed this by adding function.filename = filename on line 2011; unsure if it covers all cases though.

Could you please paste the diff? I'm not sure which commit you patched, and I also couldn't immediately recreate your workaround looking at the source.

jrfonseca avatar Nov 09 '24 15:11 jrfonseca