如何识别线程在哪里触及另一个线程的堆栈?

时间:2013-02-26 00:56:06

标签: c windows winapi

我通过英特尔的Inspector XE运行应用程序,它告诉我我的一个线程正在访问另一个线程的堆栈,但它不能告诉我涉及哪些线程或代码在哪里发生。

我当时认为可能存在某种每线程VirtualProtect或某种方式在上下文切换期间调用代码,但我无法找到任何内容。

我有什么方法可以抓住行为中的线索,还是我运气不好?

1 个答案:

答案 0 :(得分: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);),找到该结构或指针被修改的位置,并确保它未被修改为指向堆栈。