1

我正在通过 Intel 的 Inspector XE 运行一个应用程序,它告诉我我的一个线程正在访问另一个线程的堆栈,但它无法告诉我涉及哪些线程或它发生在代码中的什么位置。

我在想可能有某种每线程VirtualProtect或某种方式在上下文切换期间调用代码,但我找不到任何东西。

有什么方法可以让我捕捉到行为中的线索,还是我不走运?

4

1 回答 1

0

从线程创建例程开始。确保传递的指针不指向堆栈。你应该能够使用 grep 来帮助解决这个问题。例如。假设您使用 pthreads,grep -E pthread_create\([^,]+\,[^,]+\,[^,]+\,[^&]+\& *.c或者类似的东西可能会给您带来罪魁祸首,如果指针是在 pthread_create 函数调用中使用 & 运算符创建的。

您可能会考虑构建一个数组标识符列表,使用grep -E "[[:alnum:]_]+[[:space:]]+[[:alnum:]_]+\[[^]]+]" *.c,并基于函数内部声明的任何数组构建一个模式列表。

否则,grep -E pthread_create *.c至少会给你创建一个线程的每一行,以及传递到入口点的指针的表达式。如果该指针指向 malloc 的结构或指针(例如fubar **argument; argument = malloc(sizeof *argument);),则查找该结构或指针的修改位置,并确保它没有被修改为指向堆栈。

于 2013-02-26T02:55:39.540 回答