标签: callstack

呼叫堆栈中的某个更高的呼叫

当调用者在堆栈中更高时,这意味着什么?例如,假设我启动一个程序,一个表单加载(我们称之为a),然后这个表单调用另一个表单(b).被调用的表单将位于堆栈的顶部,因此如果这个表单称为表单a,那么这是一个调用者更高的堆栈调用下面的东西吗?

谢谢

callstack execution

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

为什么localarr ==&localarr?

我的意思是,为什么这个数字与控制台相同?

#include <stdio.h>
int main()
{
    char localarr[99];
    printf("%d\n",(int)localarr);
    printf("%d\n",(int)&localarr);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,localarr的地址实际上并没有存储在任何变量中.但是生成的代码可以存储在幕后,或者至少gcc可以发出警告,而不是在我将此类函数传递给期望char**的函数时允许段错误.为什么我们有这种行为?

相关:为什么

char **ppl = &localarr;
Run Code Online (Sandbox Code Playgroud)

结果是:

error: cannot convert ‘char (*)[99]’ to ‘char**’
Run Code Online (Sandbox Code Playgroud)

c arrays callstack local memory-address

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

切换到内核转储中的用户堆栈

有没有办法在进行事后调试时切换到内核转储中特定进程的用户模式?

我记得在使用.process命令进行实时调试时这样做.

callstack windbg usermode

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

获取当前呼叫堆栈

是否有可能在Windows应用商店中获取当前的调用堆栈,而不会抛出异常?

我找到了这个答案,但它不适用于Windows应用商店.

为什么我需要这个

我需要得到调用堆栈,因为我有一个DirectX纹理内存泄漏.

我想在分配它时将调用堆栈附加到我的纹理.在一些程序使用之后,我打印了尚未解除分配的所有纹理的callstack.

应该很容易看到我忘记取消分配纹理的位置.

c# callstack windows-8 windows-runtime windows-store-apps

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

在 vuex 中设置 firebase.User 导致永恒循环

更新:此错误仅在启用 vuex 严格模式时发生

我正在使用 Firebase 身份验证构建 Vue 应用程序,但该应用程序失败并显示以下错误消息:

[Vue 警告]:观察者回调错误“function () { return this._data.$$state }”:“错误:[vuex] 不要在变异处理程序之外改变 vuex 存储状态。”

错误:[vuex] 不要在变异处理程序之外改变 vuex 存储状态。

未捕获的 RangeError:超出最大调用堆栈大小

当我将用户提交到我的 main.ts 文件中的 Vuex 存储时发生错误:

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    store.commit(constants.auth.SET_USER, user) // THIS LINE
    store.commit(constants.auth.SET_AUTHENTICATED, true)
    router.push('/')
  } else {
    store.commit(constants.auth.SET_USER, null)
    store.commit(constants.auth.SET_AUTHENTICATED, false)
    router.push('/signup')
  }
  if (!app) {
    app = new Vue({
      router,
      store,
      render: (h) => h(App),
    }).$mount('#app')
  }
})
Run Code Online (Sandbox Code Playgroud)

这是我的突变:

[constants.auth.SET_USER](state: AuthState, payload: firebase.User): void {
      state.user = payload
}
Run Code Online (Sandbox Code Playgroud)

我可以从 …

callstack firebase typescript vue.js vuex

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

堆栈变量的 C 返回地址 = NULL?

在 C 中,当您有一个函数返回指向它的局部(在堆栈上)变量之一的指针时,调用函数会返回 null。为什么会这样?

我可以在我的硬件上用 C 语言做到这一点

void A() {
    int A = 5;
}

void B() {
    // B will be 5 even when uninitialised due to the B stack frame using
    // the old memory layout of A
    int B;
    printf("%d\n", B);
}

int main() {
    A();
    B();
}
Run Code Online (Sandbox Code Playgroud)

由于堆栈帧内存没有被重置,并且 B 覆盖了堆栈中 A 的内存记录。

但是我做不到

int* C() {
    int C = 10;
    return &C;
}

int main() {
    // D will be null ?
    int* D = C(); …
Run Code Online (Sandbox Code Playgroud)

c assembly callstack undefined-behavior

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

是否为 c/c++ 中的块(条件或无条件)代码分配了新的堆栈帧?

我查看了区分堆栈和堆分配的帖子。据我所知,堆栈帧是为每个函数调用分配的。

但我的问题在于函数内部的块?如何为此类代码管理/分配内存?这样的堆栈帧的本地存储大小是如何创建的?

class A; class B; class C;

func block() {
    if (condition) {
        A var;
    } else {
        B var;
    }

    {
        A var;
        B var;
        C var;
    }

}
Run Code Online (Sandbox Code Playgroud)

c++ stack callstack memory-management function

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

C 代码的 x86 反汇编生成:orq $0x0, %(rsp)

我编写了以下 C 代码: 在此处输入图片说明

它只是分配一个包含 1000000 个整数的数组和另一个整数,并将数组的第一个整数设置为 0

我编译这个使用 gcc -g test.c -o test -fno-stack-protector

它给出了一个非常奇怪的反汇编:在此处输入图片说明

显然,它在循环中不断在堆栈上分配 4096 个字节,并且每 4096 个字节与 0“或”,然后一旦达到 3997696 个字节,它就会进一步分配 2184 个字节。然后继续将第 4000000 个字节(从未分配过)设置为 5。

为什么不分配请求的全部 4000004 字节?为什么它在每 4096 个字节“或”一个 0,这是一条无用的指令?

我在这里理解错了吗?

注意:这是用 gcc 9.3 版编译的。gcc 7.4 版不执行循环和“或”每 4096 个字节为 0,但它只分配了 3997696+2184=3999880 个字节,但仍将第 4000000 个字节设置为 5

c assembly gcc callstack x86-64

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

是否指定在 x64 上推送堆栈指针时会发生什么?

我在 x64 上用汇编编程,我打算在堆栈中推送一个地址。我打算编写push %rsp,但是,由于此指令更改了 的值%rsp,我不确定将推送什么值。

具体来说,如果我运行以下命令:

movq $0x10, %rsp
pushq %rsp
Run Code Online (Sandbox Code Playgroud)

内存地址是否0x8包含0x100x8?这个处理器是依赖的​​还是所有 x64 处理器的标准?

assembly callstack x86-64 instructions

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

为什么esp后面加的是0x10呢?

我正在阅读维基百科文章,并且无法理解为什么add esp, 0x10下面的代码块末尾有一个。我会放弃我自己的假设,只是问 \xe2\x80\x93 为什么?

\n
printnums:\n    ; stack setup\n    push ebp\n    mov ebp, esp\n    sub esp, 0x08\n    mov [ebp-0x04], ecx    ; in x86, ecx = first argument.\n    mov [ebp-0x08], edx    ; arg2\n    push [ebp+0x08]        ; arg3 is pushed to stack.\n    push [ebp-0x08]        ; arg2 is pushed\n    push [ebp-0x04]        ; arg1 is pushed\n    push 0x8065d67         ; "The numbers you sent are %d %d %d"\n    call printf\n    ; stack cleanup\n    add esp, 0x10\n    nop\n    leave\n    retn 0x04\n …
Run Code Online (Sandbox Code Playgroud)

x86 assembly stack callstack

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