标签: callstack

当您将数据压入堆栈或从堆栈中弹出数据时,您到底在移动什么?

这涉及基本的计算机体系结构,即具有堆栈的体系结构,没有特别的。

使用 FILO(先进后出)方法,就像使用 Intel x86 一样,您使用推送和弹出,但是什么表示或决定推送的内容?

例如,我想推送一个“变量”,比如说......我们知道芯片中的所有内容都只是两伏的二进制位、逻辑驱动电路、门、晶体管等。当我推送一个字节时包含以二进制表示的地址,如下所示:1000 0101、133或85(十六进制),一个值被移动到堆栈......这里有一些问题:

1.堆栈到底位于芯片中的什么位置?

2.芯片上的堆栈配置如何启用/禁用数据块的进出?

3.在多任务环境中通常有多个堆栈。额外的堆栈是如何或从哪里来的?

我知道这可能是题外话,但我希望从硬件方面更好地了解堆栈本身。不,我不想看到板的图片,我明白了,但我想设想数据如何到达它,堆栈到底在哪里,它在芯片中是什么,以及它是如何配置的。

assembly callstack stack-memory

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

错误:SymGetLineFromAddr64,GetLastError:487(地址:)

我正在尝试使用 StackWalker 来获取调用堆栈。运行时出现487错误。有人有什么想法吗?

c++ callstack exception

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

Webpack、Sass - 超出最大调用堆栈大小

我正在为我的 JS 应用程序使用 Webpack。对于样式,我使用 Sass。我的应用程序非常大,所以我使用了很多@mixins 和@includes。

在过去的几天里(虽然应用程序的 SASS 数据增长了一些),我多次遇到相同的以下错误:“未捕获的范围错误:超出了最大调用堆栈大小”。

你们中有人以前也遇到过 Sass 的这个问题吗?通常怎么会出现这个错误呢?

编辑:

好吧,我发现递归不是问题。它适用于 Mac 的 Firefox 和大多数 Windows 浏览器,但不适用于 Mac 的 Chrome 和 Safari,因为它们的调用堆栈大小限制要低得多。

有没有一种有效的方法可以轻松地假装达到浏览器的调用堆栈大小?我读到了有关 webpack 的内容Uglify,但这只是减少了我的应用程序的大小,而不是调用量,对吧?

还有其他想法吗?

javascript callstack sass webpack

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

是否可以包装 logrus.Logger 函数而不丢失行号前缀?

当使用包装的 logrus 函数/记录器时,记录器会使用记录器函数调用的文件名和行号作为所有日志行的前缀,例如:

INFO[0000]logging.go:39 myfolder/logging.Info()
Run Code Online (Sandbox Code Playgroud)

如果我像这样包装日志函数,例如:包日志记录

import (
    "fmt"
    "github.com/sirupsen/logrus"
    "os"
    "path"
    "runtime"
)

var (
    log *logrus.Logger
)

func init() {

    log = logrus.New()
    log.SetReportCaller(true)
    log.Formatter = &logrus.TextFormatter{
        CallerPrettyfier: func(f *runtime.Frame) (string, string) {
            filename := path.Base(f.File)
            return fmt.Sprintf("%s()", f.Function), fmt.Sprintf("%s:%d", filename, f.Line)
        },
    }
}

func Info(args ...interface{}) {
        log.Info(args...)
}
Run Code Online (Sandbox Code Playgroud)

该函数发出的每一行都将以调用的行号为前缀logging function。这符合预期,但所需的行为是每行都以调用的行的行号作为前缀Info

期望的输出应该是:

INFO[0000]myfile.go:39 myfolder/myfile.myfunction()
Run Code Online (Sandbox Code Playgroud)

有什么办法解决吗?

logging callstack go

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

调用堆栈是否在 C++ 中先入/先出?

每次我们调用该函数时,激活记录的堆栈(通常只是称为堆栈)随着一条记录增长。相反,当函数返回时,它的记录不再被使用等等。栈(也叫调用栈)是一种按照先进先出的规则一端增长和收缩的数据结构。

最后一行是否正确?我在 Bjarne Stroustrup 所著的《使用 C++ 的编程原理和实践》一书中读到了它。

c++ callstack

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

调用堆栈和堆栈有什么区别?

我想我可能问了一个非常错误的问题,但我确实尝试通过谷歌搜索来理解它,但没有运气。

众所周知,我们有栈和堆。动态分配的堆,局部变量的栈等

假设我有以下 C++ 代码。

void bla(int v1, int v2, int v3) {
    int g = v1 + v2+ v3;
}

void nice(int g){
    int z = 20;
    int k = 30;
    bla(g, z, k);
}

int main(){
    cout<<"Hello World";
    nice(40);
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们想象有一个堆栈。据我所知,例如值z,k,g将存储在堆栈中。但是当我调用调用的函数时,这些nice存储bla在哪里?我读到每个函数执行都会导致调用堆栈大小增加 1。我想说,即使创建局部变量也会导致调用堆栈增加 1。

那么,那些( callstack, stack) 到底有什么关系呢?

这是我的假设:

当我们调用 时,就会创建nice全新的。stack在那里,我们存储z and k. 当nice调用时bla,现在stack会创建另一个堆栈bla并存储第二个堆栈v1,v2,v3,g。等等。每个函数都需要自己的callstack …

c++ memory stack callstack heap-memory

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

JavaScript 更改控制台调用堆栈

正确行为

当我console.log()直接从函数调用时,我调用的堆栈(函数和文件)在开发工具控制台中是正确的,正如预期的那样。

main.js

function main() {
    // Works correctly
    console.log('Hello from main()!');
}
Run Code Online (Sandbox Code Playgroud)

安慰:

Hello from main()!    ...    main.js:3                       
Run Code Online (Sandbox Code Playgroud)

我想要的是

现在,当我添加第二个文件debug.jsconsole.log从那里调用时,我调用的文件是debug.js,这是正确的...但我需要debug()像在main.js. 不知何故,我需要修改调用者、堆栈或跟踪来欺骗console.log()它是从 调用的main.js,而实际上是从deubg.js.

代码

debug.js

function debug(msg) {
   console.log(msg)
}
Run Code Online (Sandbox Code Playgroud)

main.js

function main() {
   debug('Hello world!') // debug() in debug.js
}
Run Code Online (Sandbox Code Playgroud)

行为

目前的行为:

function main() {
   debug('Hello world!') // debug() in debug.js
}
Run Code Online (Sandbox Code Playgroud)

我想要的行为:

Hello world!    ...    debug.js:2
Run Code Online (Sandbox Code Playgroud)

javascript browser callstack console.log

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

如何避免一遍又一遍地创建同一个对象?

正如今天早上提到的,我继续研究我的 TCP 套接字。

我发现每次我通过这样的套接字发送消息时,套接字的数量都会不断增加。这仅仅意味着我不断创建和打开新的套接字,而不是重新使用已经打开的套接字。

在我的应用程序中,我有一个连接存储库,我只需要使用其中一个。但我担心我会不断地创造新的。这是它的完成方式:

public static class Repository
{
  ...
  public static Conn GetByName(string name, ...)
  {
    return result = 
      context.Set<Conn>().Where(o => o.Name == name).FirstOrDefault();
  }
}

...
Conn Connection_For_Message = Repository.GetByName(request.ConnectionName, ...);
Run Code Online (Sandbox Code Playgroud)

据我说:

  1. Repository声明 的事实static会导致在内部创建一个对象。
  2. 当该GetByName()方法执行某个FirstOrDefault()方法时Where(),这会给出已经存在的对象,并且不会创建新的对象。

现在我的印象是 1. 是正确的,但 2. 是错误的,因为Connection Connection_For_Message 总是创建一个对象的新实例。

我的印象是否正确?如果是,我该如何解决这个问题?我正在考虑Repository从静态类更改为单例,但我没有找到ISingleton或 中的东西System.Reflection,或者我正在寻找完全错误的方向?

编辑:这是该类构造函数的一部分Conn

public Conn(...)
{
    ...
    TcpConnection = new TcpConnection(...); // in here …
Run Code Online (Sandbox Code Playgroud)

c# singleton static callstack scope

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

在编译的matlab中调用堆栈

在matlab中,可以使用dbstack在当前时间检索调用堆栈,但dbstack在matlab程序的独立编译版本中不可用,是否有获取调用堆栈的替代方法,或者至少调用当前函数的函数?我想编写一个设备函数,需要知道它被调用的人,但最好是一个完整的调用栈.

matlab callstack matlab-compiler

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

C++中goto语句对堆栈的影响

goto在C++中执行语句时,下面的代码片段中的两个数组是否已从堆栈中删除?或者,当方法返回时,它们是否会从堆栈中删除?

retrySplit:
    ...
    uint32_t primsAbove[primitives.size()];
    uint32_t primsBelow[primitives.size()];
    ...
    goto retrySplit;
Run Code Online (Sandbox Code Playgroud)

此问题与使用goto语句导致的泄漏无关,但与是否可能炸毁堆栈有关.

c++ stack-overflow callstack goto destroy

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