标签: callstack

如何在Visual Studio 2005中获得完整的调用堆栈?

如何获得使用Visual Studio 2005开发的c ++应用程序的完整调用堆栈?我想有一个完整的调用堆栈,包括系统库中的代码.

我是否必须在Visual Studio中更改某些设置,还是必须安装其他软件?

c++ debugging callstack visual-studio visual-c++-2005

4
推荐指数
1
解决办法
2694
查看次数

什么可以修改帧指针?

我现在在一个相当庞大的C++应用程序中出现了一个非常奇怪的错误(大量的CPU和RAM使用以及代码长度 - 超过100,000行).这是在双核Sun Solaris 10计算机上运行的.该程序订阅股票价格馈送并将其显示在用户配置的"页面"上(页面是由用户定制的窗口构造 - 该程序允许用户配置这些页面).在其中一个底层库变为多线程之前,该程序过去没有问题.受此影响的程序部分已相应更改.关于我的问题.

大约每三次执行一次,该程序将在启动时出现段错误.这不一定是一个严格的规则 - 有时它会连续三次崩溃,然后连续工作五次.这是有趣的段错(阅读:痛苦).它可以以多种方式表现出来,但最常见的是函数A调用函数B,并且在进入函数B时,帧指针将突然设置为0x000002.功能A:

   result_type emit(typename type_trait<T_arg1>::take _A_a1) const
     { return emitter_type::emit(impl_, _A_a1); }
Run Code Online (Sandbox Code Playgroud)

这是一个简单的信号实现.impl_和_A_a1在崩溃时在其框架内定义良好.在实际执行该指令时,我们最终在程序计数器0x000002处.

这并不总是发生在该功能上.事实上,它发生在很多地方,但这是一个更简单的案例,不会留下太多的错误空间.有时会发生什么是堆栈分配的变量将突然出现在垃圾内存(总是在0x000002上),无论如何.其他时候,相同的代码将运行得很好.所以,我的问题是,什么能够严重破坏堆栈?什么可以实际改变帧指针的值?我当然没听说过这样的事情.关于我能想到的唯一一件事是在数组上写出越界,但是我用堆栈保护器构建了它,它应该提供任何发生的实例.我也在这里的堆栈范围内.我也不喜欢 看看另一个线程如何覆盖第一个线程堆栈上的变量,因为每个线程都有自己的堆栈(这都是pthreads).我已经尝试在linux机器上构建它,虽然我没有在那里得到段错误,但大约有三分之一它会冻结在我身上.

c++ callstack corruption

4
推荐指数
1
解决办法
1862
查看次数

如何记录具有完整调用堆栈的异常?

我想使用ELMAH记录一个异常(不将其一直抛出到调用堆栈中),并且它记录整个调用堆栈。

示例代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        DoSomething();
    }

    private void DoSomething()
    {
        try { TrySomething(); }
        catch (Exception ex) { LogException(ex); }
    }

    private void TrySomething()
    {
        throw new NotImplementedException();
    }

    public static void LogException(Exception ex)
    {
        var currentStack = new System.Diagnostics.StackTrace(true);
        Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
    }
Run Code Online (Sandbox Code Playgroud)

现在,在LogException方法中,我可以看到调用堆栈告诉我名为TrySomething()的DoSomething(),并且引发了异常,但是我看不到调用堆栈显示了称为DoSomething()的Page_Load()。我希望能够看到完整的调用堆栈。

LogException方法内部的ex.StackTrace的示例:

at WebApplication1._Default.TrySomething() in C:\Projects\test\GeneralTests\WebApplication1\Default.aspx.cs:line 26
at WebApplication1._Default.DoSomething() in C:\Projects\test\GeneralTests\WebApplication1\Default.aspx.cs:line 20
Run Code Online (Sandbox Code Playgroud)

我可以从System.Diagnostics.StackTrace()获取完整的调用堆栈,例如:

at WebApplication1._Default.LogException(Exception ex)
at WebApplication1._Default.DoSomething()
at WebApplication1._Default.Page_Load(Object sender, EventArgs e)
[snip]
Run Code Online (Sandbox Code Playgroud)

(我可以通过遍历StackTrace的每一帧来获取行号和源文件详细信息)

但是,如何使用此调用堆栈详细信息将此注入异常或引发新异常?有没有一种优雅的方法可以做到这一点?我错过了真正明显的东西吗?

c# error-handling callstack elmah

4
推荐指数
2
解决办法
5122
查看次数

VS 2010调试 - 从哪里调用方法?

在C#,VS 2010中,是否有键盘快捷键可以查看调试时断点的位置?

例如,如果我在一个名为myMethod()的方法中有一个断点,并且它被命中,那么如何查看它被调用的是哪一行?

c# debugging callstack visual-studio-2010

4
推荐指数
1
解决办法
2108
查看次数

c#应用程序中的非托管调用堆栈

我在编写的非托管DLL中遇到访问冲突错误,但是当我尝试在ac#应用程序中调试它时,它只会在Visual Studio的调试窗口中获取调用堆栈的最后一帧.

我有debug-> exceptions-> System.AccessViolationException设置为在抛出调试器时中断它.

myunmanaged.dll!ViolatingFunc() Line 100 + 0xc bytes
- - - -
[external code] //myunmanaged.dll!function that I want to see
- - - -
somecsharp.exe!com.somewhere.Form1.CallFuncThatCallsViolator();
Run Code Online (Sandbox Code Playgroud)

我希望走上非托管堆栈,看看数据转向garbeldegook的位置.这可能吗?

回答 在此输入图像描述

启用非托管调试是第1步,但为了让我一路走到那里,我启用了微软符号.

这使我的堆栈跟踪看起来更像这样:

myunmanaged.dll!ViolatingFunc() 
- - - -
myunmanaged.dll!SomeFunc2() 
- - - -
myunmanaged.dll!SomeFunc()
- - - -
[managed to unmanaged code transition]
- - - -
somecsharp.exe!com.somewhere.Form1.CallFuncThatCallsViolator();
Run Code Online (Sandbox Code Playgroud)

c++ debugging pinvoke callstack visual-studio-2010

4
推荐指数
1
解决办法
1734
查看次数

困惑于Java内存管理(堆栈和堆)

这可能听起来很愚蠢,但我仍然不清楚Java Stack和内存堆.我从学习中得知的是:

1)所有方法调用都在堆栈上进行.

2)本地分配的所有内存都在内存堆上(关于这一点不是很清楚)

3)新运算符(在方法或类中)分配的所有内存都在内存堆上.

我担心以下情况:

1)如果我在方法中创建一个int变量并返回它,它会去哪里(我相信它会进入堆栈,但需要澄清).

2)如果我在方法中创建一个新对象,即使在方法执行结束后它仍然存在于堆内存中(我明白这是因为当我将这个对象分配给某些对象时,由java创建的对象的哈希码保持不变外部引用变量或我返回此对象).

3)我的问题是如果我没有将第2点中提到的对象分配给任何引用或者我没有返回它,会发生什么.它仍然是在堆上创建的吗?逻辑上它应该但请赐教.

java callstack memory-management

4
推荐指数
1
解决办法
1351
查看次数

堆栈驻留缓冲区溢出64位?

我正在研究一些与安全有关的事情,现在我正在玩我自己的堆栈.我正在做的事应该非常简单,我甚至都没有尝试执行堆栈,只是为了表明我可以控制64位系统上的指令指针.我已经关闭了所有我能够使用它的保护机制(NX-bit,ASLR,也用-fno-stack-protector -z execstack编译).我没有那么多64位汇编的经验,花了一些时间搜索和试验自己后,我想知道是否有人能够解决我遇到的问题.

我有一个程序(下面的源代码),它只是将一个字符串复制到一个没有边界检查的堆栈驻留缓冲区.但是,当我用一系列0x41覆盖时,我希望看到RIP设置为0x4141414141414141,而我发现我的RBP设置为此值.我确实遇到了分段错误,但是在执行RET指令时RIP不会更新为此(非法)值,即使RSP设置为合法值也是如此.我甚至在GDB中验证了在RET指令之前有可读存储器在RSP处包含一系列0x41.

我的印象是LEAVE指令:

MOV(E)SP,(E)BP

POP(E)BP

但是在64位上,"LEAVEQ"指令似乎(类似):

MOV RBP,QWORD PTR [RSP]

我认为这只是通过在执行该指令之前和之后观察所有寄存器的内容来实现的.LEAVEQ似乎只是RET指令的上下文相关名称(GDB的反汇编程序给它),因为它仍然只是一个0xC9.

RET指令似乎与RBP寄存器有关,可能是解除引用它?我认为RET确实(类似):

MOV RIP,QWORD PTR [RSP]

但是就像我提到的那样,似乎取消引用RBP,我认为这样做是因为当没有其他寄存器似乎包含非法值时,我得到了分段错误.

该计划的源代码:

#include <stdio.h>
#include <string.h>

int vuln_function(int argc,char *argv[])
{
    char buffer[512];

    for(int i = 0; i < 512; i++) {
        buffer[i] = 0x42;
    }

    printf("The buffer is at %p\n",buffer);

    if(argc > 1) {
        strcpy(buffer,argv[1]);
    }

    return 0;
}    

int main(int argc,char *argv[])
{
    vuln_function(argc,argv);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

for循环只是用0x42填充缓冲区的合法部分,这使得在溢出之前很容易在调试器中看到它.

调试会话的摘录如下:

(gdb) disas vulnerable
Dump of assembler code for function vulnerable:
   0x000000000040056c …
Run Code Online (Sandbox Code Playgroud)

linux stack-overflow 64-bit callstack gdb

4
推荐指数
1
解决办法
5070
查看次数

堆栈分配的向量如何在c ++中扩展?

如果我声明一个这样的矢量:

int main() {
    vector<string> names;
    int something_else_on_the_stack = 0;
    names.add("John");
    names.add("Annie");
}
Run Code Online (Sandbox Code Playgroud)

你怎么能真正"添加"元素到名称向量?如果名称是堆栈分配的,那么堆栈上的"something_else_on_the_stack"不应该在它之后吗?那么如何为已经分配的向量添加名称?

c++ memory callstack memory-management

4
推荐指数
2
解决办法
623
查看次数

在Intelllij中调用树

我想在Intellij中看到方法调用树.我知道我们可以使用Ctrl + Alt + H来完成它,但我正在寻找类似于UML图的图形输出.我们怎么能这样做?

java methods callstack intellij-idea

4
推荐指数
1
解决办法
1111
查看次数

Java - 保存/恢复调用堆栈

是否可以在执行期间保存调用堆栈的状态,然后将堆栈恢复到该状态,在最顶层的方法调用中重新启动?

java callstack

4
推荐指数
2
解决办法
699
查看次数