标签: callstack

23
推荐指数
3
解决办法
7262
查看次数

addr2line中的行号错误

我试图在C++程序中的回溯中找到确切的调用行.现在我正在使用这些行(来自backtrace的手册页)来获取跟踪:

  void *bt_buffer[1000];
  char **bt_strings;
  int bt_nptrs = backtrace(bt_buffer, 1000);
  bt_strings = backtrace_symbols(bt_buffer, bt_nptrs);
Run Code Online (Sandbox Code Playgroud)

在bt_strings中,我找到了表单的行

./prog() [0x402e42]
Run Code Online (Sandbox Code Playgroud)

现在我取地址(十六进制字符串)并将其提供给addr2line.这有时会导致明显错误的行号.互联网搜索让我看到这篇文章,其中显示了这一点

readelf -wl ./prog
Run Code Online (Sandbox Code Playgroud)

表示该行的确实位置,或者表示该符号移动到当前行的行数.

编辑:这种情况发生在我编译时-g -O0,即明确没有优化.编译器gcc 4.6.3是否有我错过的另一个编译器标志?

我的问题如下:我需要自动执行此操作.我需要我的程序来创建一个回溯(完成),提取文件(完成)和行号(失败).

我当然可以调用readelf和解析输出,但这并不合适,因为输出因符号而异,具体取决于具体发生的情况.有时符号的地址在一行中,而在下一行中有关行偏移的信息......

总结一下:

有没有一种优雅的方法可以在运行时从程序中的回溯中获取函数调用的确切行号?

编辑:示例代码:

#define UNW_LOCAL_ONLY
#include <libunwind.h>
#include <execinfo.h>
#include <iostream>
#include <stdlib.h>

void show_backtrace()
{
  // get current address
  void* p = __builtin_return_address(0);
  std::cout << std::hex << p << std::endl;

  // get callee addresses
  p = __builtin_return_address(1);
  std::cout << std::hex …
Run Code Online (Sandbox Code Playgroud)

c c++ callstack backtrace binutils

23
推荐指数
1
解决办法
4289
查看次数

Node.js中的默认堆栈大小是多少?

我知道如何设置堆栈大小,这要归功于: 如何在Node.js中增加最大调用堆栈大小

但是,默认大小是多少?(即如何获得PHP等价物phpinfo())

callstack node.js

22
推荐指数
1
解决办法
1万
查看次数

在应用程序中进行的所有函数调用的列表

我们如何列出应用程序中调用的所有函数.我尝试使用GDB,但它的回溯列表只能到主函数调用.

我需要更深的列表,即主函数调用的所有函数的列表以及从这些调用的函数调用的函数等等.

有没有办法在gdb中得到它?或者你能给我一些关于如何获得这个的建议吗?

callstack gdb gprof

21
推荐指数
3
解决办法
3万
查看次数

如何在Java中获取调用类的名称?

我想在这件事上提供一些帮助,

例:

public class A {

    private void foo() {

          //Who Invoked me

    }

}

public class B extends A { }

public class C extends A { }

public class D {

     C.foo();

}
Run Code Online (Sandbox Code Playgroud)

这基本上就是这种情况.我的问题是方法foo()怎么知道谁在调用它?

编辑:基本上我试图做一个数据库层,在类AI中将创建一个将生成SQL语句的方法.通过获取调用类的所有公共属性的值来动态生成此类语句.

java callstack

20
推荐指数
3
解决办法
2万
查看次数

在Clojure中获取一个callstack

当我运行我的Clojure程序并在执行期间出错时,我注意到REPL打印的消息只包含我执行的脚本中的顶级行号.我可以让它转储一个调用堆栈(它引用了Clojure代码的各种行号)吗?

例如:

user=> (load-file "test.clj")
java.lang.IllegalArgumentException: Wrong number of args (1) passed to: user$eval134$fn (test.clj:206)
user=>
Run Code Online (Sandbox Code Playgroud)

如果我知道的不仅仅是最高级别的电话会更好(第206行).

debugging callstack clojure

20
推荐指数
1
解决办法
4291
查看次数

堆栈内存是否连续?

编译器如何强制堆栈内存是连续的,是否会导致在程序运行时每次都移动内存,或者在运行之前是否在程序所需的堆栈上保留内存?

c++ callstack memory-management

20
推荐指数
2
解决办法
3779
查看次数

java是否有任何机制让VM自己跟踪方法调用,而不使用javaagent等?

我想动态地构建调用图,从任意方法调用开始,或者从运行的JVM本身中使用新线程开始构建调用图.(这个软件将成为负载测试另一个消耗调用图的软件的测试工具)

我知道有一些SPI接口,但看起来你需要用它们运行-javaagent标志.我想直接在VM本身访问它.

理想情况下,我想获得每个方法调用的入口和出口的回调,该方法调用的参数以及该方法中的时间.显然在单个线程内.

我知道AOP可能会这样做,但我只是想知道JDK中是否有工具可以让我捕获它.

java instrumentation trace callstack

19
推荐指数
1
解决办法
6074
查看次数

如何仅使用键盘在Visual Studio中导航调用堆栈?

我目前的解决办法是打AltD,W,C,它通过菜单调用堆栈导航,然后我可以使用箭头导航.但是一旦我按下Enter一个特定的框架,我就必须再次重复.

是否有更流畅的方式只用我的键盘导航调用堆栈?

ReSharper面向的答案对我来说没问题,如果你有的话!

callstack keyboard-shortcuts visual-studio

18
推荐指数
1
解决办法
4993
查看次数

如何从Valgrind获得完整的调用堆栈?

我使用以下参数运行Valgrind:

--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes
Run Code Online (Sandbox Code Playgroud)

在内存泄漏日志中,我看到一些错误消息,完整堆栈跟踪到main,但有些消息如下所示:

==3956== 1,999,140 (68,796 direct, 1,930,344 indirect) bytes in 5,733 blocks are definitely lost in loss record 8,842 of 8,845
==3956==    at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==3956== 
Run Code Online (Sandbox Code Playgroud)

如何获得这些错误的完整堆栈跟踪?

callstack valgrind memory-leaks

18
推荐指数
1
解决办法
2万
查看次数