Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我有一个有很多返回点的函数。有没有办法让gdb告诉我哪一个回来了?_C_Gdb - Fatal编程技术网

C 我有一个有很多返回点的函数。有没有办法让gdb告诉我哪一个回来了?

C 我有一个有很多返回点的函数。有没有办法让gdb告诉我哪一个回来了?,c,gdb,C,Gdb,我有一个返回点数目非常多的函数,我不想对每个返回点都进行穴居人,我也不想下一步遍历这个函数。除了在return语句中停止外,还有什么方法可以像finish这样做吗 我想你被设置断点卡住了。我将编写一个脚本来生成断点命令列表,以便运行并将它们粘贴到gdb中 示例脚本(Python): lines=open(文件名为'r')。readlines() break_lines=[line_num for line_num,line in enumerate(lines),如果第行和第行中的“return

我有一个返回点数目非常多的函数,我不想对每个返回点都进行穴居人,我也不想下一步遍历这个函数。除了在return语句中停止外,还有什么方法可以像finish这样做吗

我想你被设置断点卡住了。我将编写一个脚本来生成断点命令列表,以便运行并将它们粘贴到gdb中

示例脚本(Python):

lines=open(文件名为'r')。readlines()
break_lines=[line_num for line_num,line in enumerate(lines),如果第行和第行中的“return”(返回

line_num>first和line_num有点像拉伸,但是
catch
命令可以在很多事情上停止(比如分叉、退出、接收信号)。您可以使用
catch-catch
(因异常而中断)若要在C++中实现你想要的,如果你在函数中包装函数>尝试/最后< /COD>。(虽然这会告诉你它从何而来在很大程度上取决于优化:常见的返回案例通常会被gcc折叠起来)。

利用这个机会来分解看起来显然太大的函数怎么样?

。我的答案是:

显然,你应该重构这个函数,但是在C++中,你可以用这个简单的权宜之计在五分钟内处理这个问题:

class ReturnMarker
{
   public:
   ReturnMarker()  {};
   ~ReturnMarker() 
   {
      dummy += 1; //<-- put your breakpoint here
   }
   static int dummy;
}

int ReturnMarker::dummy = 0;
您可以尝试找出函数实际返回的位置。完成当前帧的执行,执行反向步骤,然后您应该停止在刚刚返回的语句

(gdb) fin
(gdb) reverse-step

我不知道你的要求是否超过了“在返回线上设置一个断点并运行gdb直到下一个断点”这正是我想要的,除了手动在每个断点上设置一个断点之外,我不知道该怎么做。虽然我通常是多个返回点的捍卫者,足以形容为“荒谬”似乎建议进行一些重构……似乎函数的大小不符合Alex的要求。否则,为什么他会说这很荒谬,并将其归咎于Linus?@Brian:Alex的回答表明他可能正在研究linux内部的一些毛茸茸的东西或同样神秘的东西,而每个规则都有例外。我该怎么办阿历克斯:加了一个(又快又脏)代码生成是你的朋友。即使当要生成的代码是GDB脚本。我知道,但是如果C++对C++有用的话,它的功能很可能会被重新编译。这是一个很好的答案,我投票给另一个实例。但是这个问题指定了C,而不是C++。公平点。我用Ben Jackson来解释,几乎所有C函数都可以。为了测试,COL重新编译为C++,但假定C++编译器可用。
void LongFunction()
{
    ReturnMarker foo;

    // ...
}
(gdb) fin
(gdb) reverse-step