我正在运行Ubuntu 9.10(Karmic Koala),我看了一下jmp_buf结构,它只是一个12个整数的数组.当我使用setjmp并传入jmp_buf结构时,12个条目中的4个被保存.这4个条目是堆栈指针,帧指针,程序计数器和返回地址.其他8个条目是什么?它们是机器相关的吗?段表基址寄存器的另一个条目是?还有什么需要正确恢复线程/进程的环境?我查看了手册页,其他来源,但我找不到汇编代码setjmp.
在我正在创建的iPad应用程序中,我正在尝试通过输出异常的callStackSymbols来处理未捕获的异常.这可以通过以下方式完成[NSException callStackSymbols]
但是,我希望能够在所有其他活动线程上看到callStackSymbols.我知道我可以[NSThread callStackSymbols]在任何线程上使用,但我需要遍历所有活动线程才能这样做.
这可能吗?
通过使用setTimeout方法调用函数而不是直接调用函数,可以在javascript中避免堆栈溢出吗?我对setTimeout的理解是它应该启动一个新的callstack.当我查看chrome和IE的callstack时,似乎setTimeout调用正在等待函数调用返回.
这只是调试器的属性还是我的理解有缺陷?
编辑
虽然下面提供的答案是正确的,但我遇到的实际问题与我调用setTimeout(aFunction(),10)的事实有关,因为括号因此立即评估aFunction.这个问题把我排除在外.
我在调试我的Web应用程序时遇到问题.这是非常令人沮丧的,因为我一直试图通过一个小网页重现问题,我可以在jsfiddle上发布,但这似乎是"希格斯 - 布格森"的情况.
我有一个带有大型jQuery(document).ready()处理程序的网页.问题是当从jQuery(document).ready()处理程序中抛出异常时,我得到一个带有几个匿名函数的调用堆栈,并且没有指向实际抛出异常的代码的指针.
每当我尝试用一个小网页重现这种行为时,我总是得到一个指向抛出异常的代码的指针,但在生产代码中,我从来没有得到堆栈指针.这使得调试更令人沮丧且容易出错.
有没有人知道什么可能导致这种行为以及如何使它正确?
更新:我发布这个问题已有几个月了,我现在相信我已经最终重现了这个问题.我用以下HTML重现了这个问题:
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
Factorial Page
<input type='button' value='Factorial' id='btnFactorial' />
<script src="Scripts/jquery-1.6.1.js" type="text/javascript"></script>
<script type='text/javascript'>
$(document).ready(documentReady);
function documentReady() {
$('#btnFactorial').click(btnFactorial_click);
factorial(-1);
}
function btnFactorial_click() {
var x;
x = prompt('Enter a number to compute factorial for.', '');
alert(x + '! = ' + factorial(x));
}
function factorial(x) {
if (x < 0)
throw new Error('factorial function doesn\'t support negative numbers');
else if (x …Run Code Online (Sandbox Code Playgroud) 如何在Visual Studio中转储或搜索所有线程的调用堆栈?我们有一个服务器进程要调试,它有数百个线程在运行,因此应该很难手动检查每个线程.
我知道gdb中的"thread apply"可以做这种事情.所以我想知道visual studio的调试器中有类似的东西.
我也在使用visual studio 2005,所以请为VS 2005提供解决方案(在VS 2010中提供所有调用堆栈中的搜索...).
我已经为Log4net创建了一个包装器(我可能会支持NLog;我还没有决定),并且我缩进了记录的消息结果以给出调用结构的概念.例如:
2011-04-03 00:20:30,271 [CT] DEBUG - Merlinia.ProcessManager.CentralThread.ProcessAdminCommand - ProcStart - User Info Repository
2011-04-03 00:20:30,271 [CT] DEBUG - Merlinia.ProcessManager.CentralThread.StartOneProcess - User Info Repository
2011-04-03 00:20:30,411 [CT] DEBUG - Merlinia.ProcessManager.CentralThread.SetProcessStatus - Process = User Info Repository, status = ProcStarting
2011-04-03 00:20:30,411 [CT] DEBUG - Merlinia.ProcessManager.CentralThread.SendProcessStatusInfo
2011-04-03 00:20:30,411 [CT] DEBUG - Merlinia.CommonClasses.MhlAdminLayer.SendToAllAdministrators - ProcessTable
2011-04-03 00:20:30,411 [CT] DEBUG - Merlinia.CommonClasses.MReflection.CopyToBinary
2011-04-03 00:20:30,411 [CT] DEBUG - Merlinia.CommonClasses.MReflection.CopyToBinary - False
2011-04-03 00:20:30,411 [CT] DEBUG - Merlinia.CommonClasses.MhlBasicLayer.SendToAllConnections - 228 - True - False …Run Code Online (Sandbox Code Playgroud) 根据文档,我假设 Node.js 14 现在确实支持异步代码中的堆栈跟踪,但不幸的是,使用node --async-stack-traces test.js仍然只生成部分堆栈跟踪,我最有兴趣了解原因。
运行以下代码:
main()
function main() {
sub();
}
async function sub() {
console.trace('before sleep');
await delay(1000);
console.trace('after sleep');
}
function delay(ms) {
return new Promise(resolve => {
setTimeout(() => resolve(), ms);
});
}
Run Code Online (Sandbox Code Playgroud)
显示使用之前的完整堆栈,但仅显示使用之后的部分堆栈await:
~/MyDev/doberkofler/test $ node test.js
Trace: before sleep
at sub (/Users/doberkofler/MyDev/doberkofler/test/test.js:10:10)
at main (/Users/doberkofler/MyDev/doberkofler/test/test.js:6:2)
at Object.<anonymous> (/Users/doberkofler/MyDev/doberkofler/test/test.js:3:1)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47
Trace: after …Run Code Online (Sandbox Code Playgroud) 根据维基:
主叫方将返回地址压入堆栈,并且调用的子程序,当它完成,弹出返回地址关闭调用堆栈,并将控制转移到该地址.
来自Wiki的图片:

我不太明白这一点.说我有一个C程序如下:
#include <stdio.h>
int foo(int x)
{
return x+1;
}
void spam()
{
int a = 1; //local variable
int b = foo(a); //subroutine called
int c = b; //local variable
}
int main()
{
spam();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为调用堆栈应该类似于绘图,如下所示:
<None> means none local variables or params
_| parameters for foo() <int x> |_
top | local of spam() <int c> |
^ | return address of foo() |<---foo() called, when finishes, return here?
| | local …Run Code Online (Sandbox Code Playgroud) 所以,我正在编写一个2d Javascript物理模拟.性能很好,但我正在进行优化以使其更好.所以,因为程序适用于很多物理几何,我在程序中进行了几个毕达哥拉斯定理计算.总之,大约有五个计算; 它们一起运行大约每秒一百万次.所以,如果我将这个简单的毕达哥拉斯定理代码放入一个新函数并调用它,我认为它会提高性能; 毕竟,浏览器的编译方式较少.所以,我在Firefox中运行代码,得到了...... 计算执行时间增加了400%.
怎么样?它是相同的代码:Math.sqrt(x*x + y*y),那么如何将它作为一个函数加减速呢?我假设原因是函数需要时间才能被调用,而不执行代码,并且每秒增加一百万个这样的延迟会减慢它的速度?
这对我来说似乎相当惊人.这也适用于预定义的js函数吗?这似乎不太可能,如果是这样,他们如何避免呢?
代码过去是这样的:
function x()
{
dx=nx-mx;
dy=ny-my;
d=Math.sqrt(dx*dx+dy*dy);
doStuff(...
}
Run Code Online (Sandbox Code Playgroud)
我试过的是这个:
function x()
{
dx=nx-mx;
dy=ny-my;
d=hypo(dx,dy);
doStuff(...
}
function hypo(x,y)
{
return Math.sqrt(x*x+y*y);
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在使用windbg来调试Windows可执行文件.我想知道如何使用WinDBG查看传递给任何函数的参数.
例如,如果我想知道使用Immunity Debugger或Olly调试器传递给函数Kernel32!CreatefileA的参数,我将在Kernel32!CreatefileA的入口点设置一个断点.
现在在调试器窗口的右下角,我可以很好地看到程序传递给Kernel32!CreatefileA的参数是什么.喜欢这个截图.
所以我的问题是如何使用WinDBG.Is获得类似的传递参数视图?
是否有任何插件可以在视觉上像olly或免疫力一样代表堆栈?
提前致谢
callstack ×10
debugging ×3
c ×2
javascript ×2
async-await ×1
c# ×1
exception ×1
function ×1
ios ×1
jquery ×1
logging ×1
longjmp ×1
math ×1
node.js ×1
objective-c ×1
performance ×1
settimeout ×1
windbg ×1