我通过英特尔的Inspector XE运行应用程序,它告诉我我的一个线程正在访问另一个线程的堆栈,但它不能告诉我涉及哪些线程或代码在哪里发生。
我当时认为可能存在某种每线程VirtualProtect
或某种方式在上下文切换期间调用代码,但我无法找到任何内容。
我有什么方法可以抓住行为中的线索,还是我运气不好?
答案 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);
),找到该结构或指针被修改的位置,并确保它未被修改为指向堆栈。