在我的代码中,我有一些运行时断言宏(让我们称之为runtime_assert)。 这应该是多线程应用程序。
当条件传递求值为false时,runtime_assert通过转储堆栈跟踪终止程序,然后调用_exit()。
您可能知道,转储堆栈跟踪不是一项简单的任务(How to get a stack trace for C++ using gcc with line number information?)。
这个想法是通过调用system()来调用带有进程pid的gdb。
答案 0 :(得分:2)
system()
完成时,GDB附加其他线程远远超出了问题点。在这种情况下,我实际上甚至不认为困扰堆栈跟踪是值得的(当你将应用程序提供给一些“不太复杂”的用户时,它可能会有所帮助,并且你从中得到的任何信息是有用)。在这里,我只是abort()
并且有一个很好的核心文件可以仔细阅读。gettid()
和GDB初始文件以及用户定义的命令技巧来完成,但同样,不要以为我会打扰。答案 1 :(得分:0)
我记得前段时间对SO的类似讨论。在搜索论坛后,我发现是你问过的,这是你在这个问题中指出的那个主题。
你见过nobar的回答吗?它似乎正是你在寻找的。诀窍是使用 execlp 来调用gdb而不是 system :
How to get a stack trace for C++ using gcc with line number information?