如何查看SoC线程的栈起始地址及大小?

2026-10-19 10:05:43 10阅读

在 Linux 中,每个线程都有自己独立的栈空间,用于存储线程的局部变量、函数调用信息等。我们可以通过 pthread_attr_t 数据结构来获取或设置线程的栈起始地址和栈大小。

要查看线程的栈起始地址和栈大小,使用 pthread_attr_getstack() 函数,它从线程属性对象中获取这两个信息:

#include 
int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);

参数说明:

  • attr:指向线程属性对象(pthread_attr_t 类型)的指针。
  • stackaddr:用于存储栈起始地址,传一个指向 void * 类型的指针,函数会把栈起始地址保存在该指针指向的内存中。
  • stacksize:用于存储栈大小,传一个指向 size_t 类型的指针。

返回值为 0 表示成功,非 0 表示失败(返回错误码)。

要设置线程的栈起始地址和栈大小,使用 pthread_attr_setstack() 函数:

#include 
int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);

参数说明:stackaddr 指定栈的起始地址,通常由用户分配一块内存作为线程栈并传递其地址;stacksize 指定栈大小,必须大于系统允许的最小栈大小(通常至少为 PTHREAD_STACK_MIN),否则返回错误。

获取线程栈信息的示例

#include 
#include
#include

void *thread_function(void *arg) {
printf("Thread running...
");
pthread_exit(NULL);
}

int main() {
pthread_t thread;
pthread_attr_t attr;
void *stackaddr;
size_t stacksize;

// 初始化线程属性对象
pthread_attr_init(&attr);

// 获取默认的栈起始地址和栈大小
pthread_attr_getstack(&attr, &stackaddr, &stacksize);
printf("Default stack address: %p
", stackaddr);
printf("Default stack size: %zu bytes
", stacksize);

// 创建线程
if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {
perror("Failed to create thread");
return 1;
}

// 等待线程结束
pthread_join(thread, NULL);

// 销毁线程属性对象
pthread_attr_destroy(&attr);
return 0;
}

输出结果示例:

Default stack address: 0x7fcd49800000
Default stack size: 8388608 bytes

单独设置或获取栈大小/地址

除了同时获取栈起始地址和大小外,还可以单独设置或获取:

  • pthread_attr_setstacksize():设置栈大小。
  • pthread_attr_getstacksize():获取栈大小。
  • pthread_attr_setstackaddr():设置栈起始地址。
  • pthread_attr_getstackaddr():获取栈起始地址。

例如只想设置栈大小而不改变起始地址,可用 pthread_attr_setstacksize():

#include 
#include

int main() {
pthread_attr_t attr;
size_t stacksize = 16 * 1024 * 1024; // 设置栈大小为 16 MB

// 初始化线程属性
pthread_attr_init(&attr);

// 设置栈大小
pthread_attr_setstacksize(&attr, stacksize);

// 获取并打印新的栈大小
pthread_attr_getstacksize(&attr, &stacksize);
printf("New stack size: %zu bytes
", stacksize);

// 销毁线程属性对象
pthread_attr_destroy(&attr);
return 0;
}

注意事项

  • 栈大小不能小于系统允许的最小栈大小,可通过 PTHREAD_STACK_MIN 宏获取。
  • 手动设置栈地址时,需确保传递的内存块有效且大小合适。

通过 pthread_attr_getstack() 和 pthread_attr_setstack() 可以方便地获取和设置线程栈的起始地址与大小。对于需要自定义线程栈的应用,合理管理栈空间能提高程序稳定性与性能;在多线程编程中,了解和控制线程栈使用对于高效内存管理和避免栈溢出至关重要。


作者:不脱发的程序猿
链接:https://www.aiddithome.com/p/63d633edfe6b7.html
本作遵循 [CC BY 4.0 署名] 许可,版权归作者所有。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
3条评论

自定义线程栈大小这块讲得清楚,PTHREAD_STACK_MIN 的坑也提醒了。

修啥都行二哥
2楼 · 2天前

防止栈溢出的好参考,简单直观照着就能用。

用 pthread_attr_getstack 查栈起始地址和大小很实用,嵌入式调试常用到。