小编sta*_*yli的帖子

如何在Windows中以编程方式从调用堆栈帧中读取函数参数?

我试图遍历调用堆栈帧并从中提取一些信息.我能够通过使用提取的文件名,行号,和函数名StackWalk64,SymGetSymFromAddr64以及SymGetLineFromAddr64从WinDBG的的API.

但是,DWORD64 Params[4]in STACKFRAME64,它是一个返回值StackWalk64,仅支持从帧中读回四个64位函数参数.更糟糕的是,在32位系统上,只使用低32位Params[4],因此超过32位的单个参数需要两个或更多元素.

typedef struct _tagSTACKFRAME64 {
  ADDRESS64 AddrPC;
  ADDRESS64 AddrReturn;
  ADDRESS64 AddrFrame;
  ADDRESS64 AddrStack;
  ADDRESS64 AddrBStore;
  PVOID     FuncTableEntry;
  DWORD64   Params[4];
  BOOL      Far;
  BOOL      Virtual;
  DWORD64   Reserved[3];
  KDHELP64  KdHelp;
} STACKFRAME64, *LPSTACKFRAME64;
Run Code Online (Sandbox Code Playgroud)

我找不到任何API来从堆栈框架中读取所有参数而没有限制.

我正在考虑使用ebp/ rbp从堆栈(x86/x64)和寄存器(x64)中提取值.但是,如果我这样做,只能获得参数的"可能"值.

我可以使用任何API来获得准确的值吗?如果我能得到参数的类型和名称会更好.

c++ windows winapi callstack windbg

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

使用pybind11从c ++调用Python函数

我正在尝试从包含main()使用的函数的C ++代码中调用python函数Pybind11。但是我发现很少有参考资料可用。现有的大多数文档都谈到了相反的方向,即从Python调用C ++。

有没有完整的示例说明如何执行此操作?我找到的唯一参考是:https : //github.com/pybind/pybind11/issues/30

但是它的信息很少。

c++ pybind11

6
推荐指数
3
解决办法
3139
查看次数

如何使用 Python 正则表达式获取 C++ 文件中的第一个 #include 语句?

我想#include尽快使用 Python 正则表达式从 .cpp 文件中获取第一条语句。

例如,

/* Copyright: 
This file is 
protected 
#include <bad.h>
*/

// Include files:
#undef A_MACRO
#include <stddef.h>  // defines NULL
#include "logger.h"

// Global static pointer used to ensure a single instance of the class.
Logger* Logger::m_pInstance = NULL; 
Run Code Online (Sandbox Code Playgroud)

应该返回 #include <stddef.h>

我知道一种方法是删除所有注释,然后从剩余文本中获取第一行。但这似乎不够快,因为它必须遍历整个文件。如果我只需要第一个#include语句,是否有任何有效的方法可以使用 Python 正则表达式来完成它?

[更新 1] 有几个人提到使用正则表达式不是一个好的解决方案。我知道这不是正则表达式的典型用例。但是有没有比正则表达式更好的方法来摆脱主要注释呢?任何建议将不胜感激。

[更新2] 感谢您的回答。但似乎还没有一个让我满意的。我的要求很简单:(1)避免遍历整个文件来获取第一行。(二)要正确处理领导意见。

c++ python regex

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

使用数组在C++中访问不同长度的多个数组的正确方法

我有几个不同长度的二维数组:

int Array_A[][2] = {{...}, {...}, {...}, ...};
int Array_B[][2] = {{...}, {...}, ...};
int Array_C[][2] = {{...}, ...};
Run Code Online (Sandbox Code Playgroud)

我需要另一个允许我访问这些数组的数组:

??? Full_Array[] = {Array_A, Array_B, Array_C};
Run Code Online (Sandbox Code Playgroud)

???我应该使用的正确类型是什么?我尝试过uint**,uint*但都不行.

如果这是不可行的,假如我是不允许更改的定义Array_A,Array_B...什么是定义一个好办法Full_Array

c++ arrays

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

有什么办法可以为 os.path 指定平台吗?

我在windows下,但是需要处理一些unix风格的路径,比如:

In[4]: os.path.abspath('/prj/vl')
Out[4]: 'C:\\prj\\vl'
Run Code Online (Sandbox Code Playgroud)

这不是我想要的正确输出。所以我想知道是否有一种方法可以强制os.path在 Unix 下工作?即我想看看是否有类似的东西:os.path.setos('Linux')

python python-2.7

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

在 Xperf 中捕获调用堆栈和事件

抱歉问了这个愚蠢的问题。我是 Xperf 新手。

我使用的是 64 位 Windows 8.1,我的应用程序也是 x64。我想使用 Xperf 捕获应用程序中的调用堆栈和我定义的事件。

我在我的应用程序中注册了 GUID 35f7872e-9b6d-4a9b-a674-66f1edd66d5c

当我使用时:

xperf -on PROC_THREAD+LOADER+Base -start UserSession -on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c -BufferSize 1024 -stackwalk profile
Run Code Online (Sandbox Code Playgroud)

我可以获得所有事件,但没有调用堆栈。但是,如果我删除-on 35f7872e-9b6d-4a9b-a674-66f1edd66d5c 并且命令行变为:

xperf -on PROC_THREAD+LOADER+Base -start UserSession -BufferSize 1024 -stackwalk profile
Run Code Online (Sandbox Code Playgroud)

这样,我就能够捕获所有调用堆栈,但没有定义的事件。

谁能告诉我用于捕获调用堆栈和事件的正确命令行是什么?另外,如果您能为我指出任何好的 Xperf 参考资料,那就更好了。

windows performance profiling xperf

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

在C++ 11中对数组中所有元素的OR/AND成员的优雅方式?

我有一个

struct A {
   bool field;
};
Run Code Online (Sandbox Code Playgroud)

所以对于一个数组A a[32],我想检查这个数组中的所有元素是否都field为真.有什么好办法呢?我可以考虑使用std::accumulate.这是C++ 11中最好的方法吗?

c++ c++11

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

How to use initializer list to initialize std::variant?

The non-variant version of initializer list works good:

std::map<int, double> a = {{1,0.1}};
Run Code Online (Sandbox Code Playgroud)

But the variant version doesn't:

std::variant<std::map<int, double>, int> b = {{1,0.1}};
Run Code Online (Sandbox Code Playgroud)

Is there a way to initialize b using initializer list? If not, what is the best way to initialize it?

c++ c++17

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

我可以指望任何STL容器的sizeof(string)或sizeof吗?

我有

string email_list[] = {"aaa@sds.com", "bbb@sdsds.com"};

for (int i = 0; i < sizeof(email_list)/sizeof(email_list[0]); i ++) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我看到一个有趣的事情:在sizeof(email_list[0])VS2012的调试模式下返回28; 但它在发布模式下提供24.但sizeof(email_list)/sizeof(email_list[0])总能给出正确的价值 - 2.所以不确定这是否是循环通过这样一个数组的正确和可靠的方法?

怎么样在其他STL容器,例如vector,map...?

c++ stl

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