标签: callstack

如何读取调用堆栈?

我们在Windows 2003服务器上通过COM +运行本机C++应用程序.我最近从事件查看器中注意到它抛出异常,特别是C0000005异常,根据http://blogs.msdn.com/calvin_hsia/archive/2004/06/30/170344.aspx表示该过程试图写入不在其地址空间内的内存,即访问冲突.

事件查看器中的条目提供了一个调用堆栈:

LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const*,class utilCDate&)+ 0xa26c LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const*,class utilCDate&)+ 0x8af4 LibFmwk!UTIL_GetDateFromLogByDayDirectory(char const*,class utilCDate&)+ 0x13a1 LibFmwk!utilCLogController :: GetFLFInfoLevel(void )const + 0x1070 LibFmwk!utilCLogController :: GetFLFInfoLevel(void)const + 0x186

现在,我明白它给我的方法名称去看看,但我感觉每行末尾的地址(例如+ 0xa26c)试图指向我在该方法中的特定行或指令.

所以我的问题是:

  1. 有谁知道如何使用这个地址或调用堆栈中的任何其他信息来确定代码中的哪一行掉进去?
  2. 有没有我可以阅读的资源,以便更好地理解调用栈,
  3. 是否有任何免费软件/开源工具可以帮助分析调用堆栈,可能是通过附加到调试符号文件和/或二进制文件?

编辑:根据要求,这是似乎导致问题的方法:

BOOL UTIL_GetDateFromLogByDayDirectory(LPCSTR pszDir, utilCDate& oDate)
{
BOOL bRet = FALSE;

if ((pszDir[0] == '%') &&
    ::isdigit(pszDir[1]) && ::isdigit(pszDir[2]) &&
    ::isdigit(pszDir[3]) && ::isdigit(pszDir[4]) &&
    ::isdigit(pszDir[5]) && ::isdigit(pszDir[6]) &&
    ::isdigit(pszDir[7]) && ::isdigit(pszDir[8]) &&
    !pszDir[9])
{
    char acCopy[9];
    ::memcpy(acCopy, pszDir + 1, 8);
    acCopy[8] = '\0';

    int …
Run Code Online (Sandbox Code Playgroud)

winapi callstack native memory-address visual-c++

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

C++程序中非常奇怪的堆栈溢出

我不久前写了一个程序(Mac OS X,C++,SDL,FMOD),它表现得相当不错.但最近我想扩展其功能并为其添加更多代码.现在,当我运行它并尝试测试新功能时,程序会与SIGABRT崩溃.

查看调试器,在函数堆栈上我看到:

  • _杀
  • 杀$ UNIX2003
  • 提高
  • __abort
  • __stack_chk_fail
  • odtworz < - 我的功能被修改了

据我所知,"__ stack_chk_fail"表示堆栈溢出.但这不是最奇怪的事情.在这个函数"odtworz"中,我有一些像这样的代码:

...

koniec = 0;
while ( koniec == 0 ) {
    ...
    if (mode == 1) {
        ...
    }
    else if (mode == 2) {
        ...
    }
    else if (mode == 3) {
       piesniOrkiestrowe[0] = '\0'; 
       while ( piesniOrkiestrowe[0] == '\0' ) { 
           losowaPiesn(); 
           char * piesnOrkiestrowa = szukajPiesniOrkiestrowej(); 
           if ( piesnOrkiestrowa != NULL ) 
              strcpy(piesniOrkiestrowe, piesnOrkiestrowa); 
       } 
       char nowyPiesnPlik[25]; 
       sprintf(nowyPiesnPlik, "%sorch/%s", PIESNI_DIR.c_str(), piesniOrkiestrowe); …
Run Code Online (Sandbox Code Playgroud)

c++ stack-overflow macos callstack

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

C中的递归和树搜索?

一种新的树木和递归功能....

我知道如何创建堆栈以及如何创建递归函数的基础知识.

我正在进行预先排序的遍历搜索,当搜索的值与该节点的值匹配时,该搜索应返回树中节点的地址.

我在返回部分遇到问题...我试着在调用堆栈上读取一些东西......但我不明白如何实现它.它已经存在或者我必须制作这个堆栈吗?如果我必须制作它,我该如何制作这个堆栈?我读到它需要与树的高度成正比...是找到树高的最佳方法来制作另一个函数吗?

这是我到目前为止编写的一些代码:Tree和NodePtr是一个指向节点的指针......

NodePtr SearchTree(int v, Tree T)
{
    //printf(" %i \n", T->value);

    if(T->value == v) 
    {
        return T;
    }
    else
    {
        if(T->Left != NULL) SearchTree(value, T->Left);
        if(T->Right != NULL) SearchTree(value, T->Right);
    }

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

c tree binary-tree callstack

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

DRAM中的堆栈是什么(在递归过程中会发生什么)?

我只想更好地了解堆栈在地址空间中的含义(即您有代码/文本,堆,数据和堆栈)

基本上我的理解是堆栈包含局部变量,但是数据包含什么和堆栈包含什么之间的区别是什么?是不是数据变量?

如果程序对函数的递归调用a()是否意味着对于每个递归级别都有一个新的堆栈?

recursion ram callstack operating-system

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

如何使用Eclipse可视化Android调用堆栈?

无论如何,我可以想象一个Android应用程序的调用堆栈?我在Eclipse中找到的只是运行线程:

在此输入图像描述

我想要的是看看我的子程序是如何被调用的,以便调试与堆栈活动相关的问题.

谢谢!

eclipse android callstack adt ddms

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

64位机器中的内存分配

我想问一下64位ubuntu Linux中的内存分配问题.

我有以下代码

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

int main(int argc, char *argv[]) {
    char buffer_one[8], buffer_two[8];

    printf("Size of char: %u\n", sizeof(char));

    printf("Buffer_two is at %p\n", buffer_two);
    printf("Buffer_one is at %p\n", buffer_one);
}
Run Code Online (Sandbox Code Playgroud)

当它运行时,会显示以下结果

$ ./sizeofchar 
Size of char: 1
Buffer_two is at 0x7fff98069910
Buffer_one is at 0x7fff98069900
Run Code Online (Sandbox Code Playgroud)

我的问题是,即使char类型的大小是1字节,我假设(如果我在这里错了请纠正我)Buffer_two并且Buffer_one彼此相邻分配,为什么Buffer_twoBuffer_one内存地址分配16个字节.

c 64-bit gcc callstack

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

删除Eclipse/JUnit调用堆栈截止

当我运行在Eclipse中失败的JUnit时,我有时会得到类似于此的调用堆栈:

java.lang.NullPointerException
    at com.a.b.c.d.e.MyTest.method(MyTest.java:73)
    at com.a.b.c.d.e.MyTest.testConvertRawInternalAtomAllowCompound(MyTest.java:65)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    .... 57 more
Run Code Online (Sandbox Code Playgroud)

我怎样才能删除截止?我想看看整个调用堆栈.谢谢!

eclipse junit callstack

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

如何创建无限递归会抛出堆栈溢出异常?

我正在尝试使用以下程序创建堆栈溢出运行时异常:

void f(int a) {
  cout << a << ", ";
  f(++a);
}

int main () {
  f(0);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行此程序时,我的计算机运行大约261824 call stack然后command terminated发生运行时错误.现在我想知道:

  1. 这是堆栈溢出的一个很好的例子吗?如果是,为什么command terminated会出现错误?
  2. 我怎么能try,catch堆栈溢出异常?
  3. 我有很多自由记忆; 为什么我的堆栈不会占用我所有的记忆?
  4. 如何确定堆栈的大小与我的对应call stack

c++ stack-overflow stack callstack exception

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

堆栈帧上的访问链接是什么?

我有关于维基百科的访问链接,但我无法清楚地了解访问链接是什么以及它们与任何功能的返回地址有何不同.有人可以简要解释一下访问链接是什么以及为什么在调用堆栈上需要它?

c callstack

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

Python 异常会在调用堆栈中上升吗?

在 Python 中,如果函数 A 调用函数 B,函数 B 调用函数 C,而函数 C 抛出一个 ValueError(作为示例),错误是否会沿着调用堆栈向上移动,从而函数 A 也抛出一个 ValueError?例如,我可以从函数 A 中的函数 C 中捕获值错误吗?

另外,如果您创建自己的仅在函数 C 中定义的异常,它是否也会上升到调用堆栈,以便函数 A 抛出相同的错误?

python error-handling callstack

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