对于调试,通常有用的是判断特定函数是否在调用堆栈中更高.例如,我们通常只想在某个函数调用我们时运行调试代码.
一种解决方案是检查更高的所有堆栈条目,但这是在堆栈深处并重复调用的函数中,这会导致过多的开销.问题是找到一种方法,允许我们以合理有效的方式确定特定函数是否在调用堆栈上更高.
类似
现在,当我的一个断言在Xcode中被触发时,我得到了断言消息,以及堆栈的转储,其中充满了对我来说没有意义的数字.
为了获得调用堆栈的跟踪,它需要我调试应用程序,并将其运行到发生断言的位置,并希望它再次断言.对于100%可重现的错误,这不是一个太大的问题,但仍然是浪费时间.
如果我在每次命中一个断言时得到一个调用堆栈跟踪,那会好得多.
如何定义将在Xcode中转储调用堆栈跟踪的断言宏?
背景
我们遇到一个问题,有时Devexpress中的网格会引发异常"引发的EConvertError:无法为TFont分配nil".
但是为了追踪这个的真正原因,我们已经将cxEdit中的Font更改为公共属性,而不是使用get和set方法.在这里,我想记录callstack.
我的问题
通常,JCL用于在出现异常时记录callstack.但是,如何在不使用raise异常的情况下记录callstack并为用户显示关于此的对话框?
我找到了这些台词:
var
GlobalStackList: TJclGlobalStackList;
Run Code Online (Sandbox Code Playgroud)
在JclDebug但我没有使用它.如果有人有一个例子如何获得callstack我会很高兴.
关心Roland Bengtsson
我可以利用gcc的backtrace在程序的任何给定点获得堆栈跟踪,但是我想从抛出异常时堆栈所处的任何帧中获取跟踪,即在堆栈展开之前.
例如,以下块
func() {
throw std::exception();
}
try {
func();
}
catch ( std::exception ) {
std::cout << print_trace();
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
应该还能以某种方式为func()保留一个框架.
以前曾经问过这个问题,但它涉及到一个未处理的异常会终止该程序,并且可能没有给callstack一个放松的机会?
有没有办法做到这一点,同时仍能正常捕获和处理异常?
可能有一种方法,比如为所有异常设置处理程序,除了生成跟踪并重新抛出异常之外什么都不做.理想情况下,我应该能够在Exception类构造函数中生成跟踪,但是在这里我不一定能控制可能遇到的异常.
Smalltalk对象thisContext看起来奇怪而奇妙.我无法理解它是什么以及它是如何工作的.甚至它如何实现延续.
对于C的调用栈,我可以很容易地想象它是如何实现和工作的.但为此......我做不到.请帮我理解一下.
在python和/或ipython交互式解释器中,如何在最后一个未处理的异常上绑定名称?即相当于
>>> try:
... 1/0
... except Exception as potato:
... pass
...
>>> format(potato)
'integer division or modulo by zero'
Run Code Online (Sandbox Code Playgroud)
必须像......
>>> 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> import sys
>>> potato = ???
Run Code Online (Sandbox Code Playgroud) 我想打印调用堆栈与更多信息,如在gdb中.
这就是我到目前为止所拥有的.
void to_print_callstack()
{
void *buffer[100];
int n = backtrace(buffer,10);
char **str = backtrace_symbols(buffer, n);
for (int i = 0; i < n; i++)
{
printf("%d: %s\n", i, str[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
当它运行时,我得到如下的东西.
0: ./test-prog() [0x4466bf]
1: ./test-prog() [0x445e1d]
2: ./test-prog() [0x443fd5]
3: ./test-prog() [0x439a99]
4: ./test-prog() [0x43302f]
5: ./test-prog() [0x4322c9]
6: ./test-prog() [0x4320cd]
7: ./test-prog() [0x43e76b]
8: /lib/libc.so.6(__libc_start_main+0xfd) [0x7fc4de7d8c4d]
9: ./test-prog() [0x431569]
Run Code Online (Sandbox Code Playgroud)
很难读懂.使用函数名称会更好.非常感谢小费.
我曾经使用过Call Stack,Call Hierarchy和Profiler。这些工具都没有在Visual Studio窗口中为我提供简单,实时的 “刚刚执行的功能列表”...。单击按钮或链接将我引导到特定的代码文件和行(如果可用)时,我需要查看一些内容。
我什么都没找到。也许,即使PDB FULL已打开,此类信息也不可用。我相信在这一点上,我必须编写一个Visual Studio 2012外接程序或扩展程序来执行我需要的操作,但同时我也遇到了问题:就一个而言,我无法从任何可行的方法中获得函数名。界面,除非我暂停调试器或遇到断点。其次,我要列出的应用程序是一个MVC应用程序,该应用程序在“ WebDev.WebServer40.exe”下作为DLL运行。
我认为这将非常简单:从扩展名创建一个工具窗口,并记录最后执行的方法以及参数列表。
有任何想法吗?提前谢谢了!!
编辑:为了更加清晰
在Delphi调用堆栈中,是否可以隐藏/折叠没有源代码的堆栈帧,相应地,没有用这些蓝点标记?
仅供参考,Visual Studio可以执行此操作:
在托管代码中,默认情况下."调用堆栈"窗口隐藏非用户代码的信息.出现以下符号而不是隐藏信息:
[<外部代码>]
http://msdn.microsoft.com/en-us/library/a3694ts5.aspx
如果解决方案适用于Delphi XE2,那将会很好.
UPDATE
它可以是一些第三方专家,甚至是使用ToolsAPI的代码
当涉及大规模递归方法调用时,必须通过修改适当的编译器参数来扩展调用堆栈大小,以避免堆栈溢出.
让我们考虑编写一个便携式应用程序,其布局足够简单,以便其用户只需要最少的技术知识,因此手动虚拟内存配置是不可能的.
运行大规模递归方法(显然是在幕后)可能会导致超出调用堆栈限制,尤其是在应用程序运行的机器受内存限制的情况下.
足够的聊天:在C++中,如果内存(几乎)已满,可以手动将调用堆栈扩展到磁盘吗?
callstack ×10
c++ ×3
debugging ×2
delphi ×2
python ×2
stack-trace ×2
asp.net-mvc ×1
assert ×1
c ×1
c# ×1
delphi-xe2 ×1
exception ×1
gcc ×1
objective-c ×1
smalltalk ×1
stack-frame ×1
toolsapi ×1
xcode ×1