问题简介:

cuda-gdb 调试 Program terminated with signal SIGKILL, Killed. The program no longer exists.

问题背景:

编写cuda程序,需要核对计算过程是否正确,所以使用cuda-gdb来进行单步调试,并显示运算过程及结果。
通过 nvcc -g -G location.cu -o location 编译cuda程序
通过 cuda-gdb location 调试程序
键入 r 程序断在 如图示:

报出错误如下:

CUDA Exception: Warp Illegal Address
The exception was triggered at PC 0x5555c9de90 (location2.cu:45)
(cuda-gdb) n
[Thread 0x7fb7ff5010 (LWP 10479) exited]Program terminated with signal SIGKILL, Killed.
The program no longer exists.

问题分析:

在gdb调试时出现以上报错信息,通常是 内存相关问题,查看系统日志 tail /var/log/kern.log -n 1000 发现如下:

Aug 12 09:29:11 nx kernel: [ 1197.607814] nvgpu: 17000000.gv11b         gv11b_fb_print_fault_info:710  [ERR]  [MMU FAULT] mmu engine id:  65, ch id:  504, fault addr: 0x7ffff4e000, fault addr aperture: 0, fault type: invalid pde, access type: virt read,
Aug 12 09:29:11 nx kernel: [ 1197.608185] nvgpu: 17000000.gv11b         gv11b_fb_print_fault_info:719  [ERR]  [MMU FAULT] protected mode: 0, client type: gpc, client id:  t1 2, gpc id if client type is gpc: 0,
Aug 12 09:29:12 nx kernel: [ 1199.027576] nvgpu: 17000000.gv11b         gk20a_fifo_deferred_reset:1604 [ERR]  chid: 503 is not bound to tsg
Aug 12 09:29:12 nx kernel: [ 1199.039202] nvgpu: 17000000.gv11b          gk20a_tsg_unbind_channel:169  [ERR]  Channel 504 unbind failed, tearing down TSG 4

第一段日志信息说是 [MMU FAULT] fault addr: 0x7ffff4e000
此时,我却任然一头雾水,在网上搜索了很多关于
cuda-gdb 调试 Program terminated with signal SIGKILL, Killed.
The program no longer exists.

这样的关键词,但所得结果均无效。搜索一下午,困惑一晚上,任然不得其解。第二天早上迷迷糊糊看向核函数的形参恍然大悟,问题不就是:将host变量引用传递给了device

在找到原因后才发现:其实,最重要的报错信息是如下,而我却忽略了

CUDA Exception: Warp Illegal Address
The exception was triggered at PC 0x5555c9de90 (location2.cu:45)

这报错信息明确说明 线程束非法地址,其异常被触发在 location2.cu 的45行处 。这意思不就是说地址非法了,再看源码

__global__
void gpu_location_kernel(DeviceArray2D<float>& struct_dev_arr_input_2D,DeviceArray2D<float>& struct_dev_arr_w1_2D, DeviceArray2D<float>& struct_dev_arr_w2_2D, DeviceArray2D<float>& struct_dev_arr_w3_2D,DeviceArray2D<float>& struct_dev_arr_b1_2D, DeviceArray2D<float>& struct_dev_arr_b2_2D, DeviceArray2D<float>& struct_dev_arr_b3_2D,DeviceArray2D<float>& struct_dev_median_layer1_reuslt, DeviceArray2D<float>& struct_dev_median_layer2_reuslt, DeviceArray2D<float>& struct_dev_final_reuslt)
{...
}

哈哈,我居然在核函数里使用引用,大错特错,再看源码调用 gpu_location_kernel 处,传递的参数居然是 host 变量的引用,大错特错。

想想为什么会犯这个错误呢?
其实我只是想通过结构体引用传递多个参数值,如果一个参数一个参数写作形参,实在是太长了。遂而将 device 地址放到了 host 结构体中,然后将 host 结构体的引用作为实参传递给核函数,这不出现非法地址,才怪!

解决办法:

只需要将 host 结构体 拷贝到 device 结构体中,然后将 device 结构体指针传递给核函数就可以了,这样既满足了传递多个参数而不追加形参,而又解决了目前的问题。
代码如下:

struct GPULocationKernelParameter{float *dev_arr_input_2D;size_t dev_arr_input_2D_pitch;int dev_arr_input_2D_rows;int dev_arr_input_2D_columns;float *dev_arr_w1_2D;size_t dev_arr_w1_2D_pitch;int dev_arr_w1_2D_rows;int dev_arr_w1_2D_columns;float *dev_arr_w2_2D;size_t dev_arr_w2_2D_pitch;int dev_arr_w2_2D_rows;int dev_arr_w2_2D_columns;float *dev_arr_w3_2D;size_t dev_arr_w3_2D_pitch;int dev_arr_w3_2D_rows;int dev_arr_w3_2D_columns;float *dev_arr_b1_2D;size_t dev_arr_b1_2D_pitch;int dev_arr_b1_2D_rows;int dev_arr_b1_2D_columns;float *dev_arr_b2_2D;size_t dev_arr_b2_2D_pitch;int dev_arr_b2_2D_rows;int dev_arr_b2_2D_columns;float *dev_arr_b3_2D;size_t dev_arr_b3_2D_pitch;int dev_arr_b3_2D_rows;int dev_arr_b3_2D_columns;float *dev_median_layer1_reuslt;size_t dev_median_layer1_reuslt_pitch;int dev_median_layer1_reuslt_rows;int dev_median_layer1_reuslt_columns;float *dev_median_layer2_reuslt;size_t dev_median_layer2_reuslt_pitch;int dev_median_layer2_reuslt_rows;int dev_median_layer2_reuslt_columns;float *dev_final_reuslt;size_t dev_final_reuslt_pitch;int dev_final_reuslt_rows;int dev_final_reuslt_columns;
};__global__
void gpu_location_kernel(GPULocationKernelParameter *dev_kernelParameter)
{GPULocationKernelParameter dev_struct_kernelParameter = *dev_kernelParameter;...
}

补充:

1.参考的cuda-gdb调试文章
CUDA-GDB 使用
CUDA C编程(三十八)CUDA调试
GDB调试操作
GDB调试

2.感悟
这个问题我思考了一下午近5h,外加困扰一晚上。现在回想这个问题的原因在报出时就已经给出了,然而我却浑然不知。所以我还是应该认认真真地去看执行过程报出的错误,里面每一个单词,每一句话都有深意。

cuda-gdb 调试 Program terminated with signal SIGKILL, Killed. The program no longer exists.相关推荐

  1. Program terminated with signal 11, Segmentation fault.

    今天写程序遇到一个问题:Program terminated with signal 11, Segmentation fault. gdb 调试现象如下: warning: no loadable ...

  2. Program terminated with signal SIGSEGV, Segmentation fault.

    问题: 在程序运行时出现了:Segmentation fault (core dumped),分段故障(堆芯转储)也就是段错误. 我首先在一篇博客上面找到如何使用gdb调试: 1.首先使用ulimit ...

  3. Linux下,Apache及PHP项目报Core错误Program terminated with signal 7, Bus error

    最近上线的一个项目,使用Apache 2.2.32及ThinkPHP3.23,每天访问量共有几万吧,但会出现几十次错误,表现就是Apache根目录下,会出现Core.XXXXX的文件,同时错误日志内会 ...

  4. 用 GDB 调试Linux程序及有用技巧

    用 GDB 调试Linux程序及有用技巧(转) armlinux   2008-06-19 10:48   阅读91   评论0 字号: 大大  中中  小小 GNU的调试器称为gdb,该程序是一个交 ...

  5. linux gdb bt core,core文件与gdb调试

    本文简单介绍core文件与gdb调试core文件的方法 概要: 1. core 文件 2. 配置core程序崩溃时产生文件 3. 可修改core文件名 4. 产生core文件的情形 5. gdb调试c ...

  6. gdb php-fpm,使用 gdb 调试 php-fpm 异常错误

    相关资源下载GDB简介 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能. 问题 ...

  7. 用gdb调试core dump文件

    gdb基本的使用方法在此就不说了. 载入core文件的命令行为: dgb exe core 例如 gdb ./testall ./core.2345 最重要的一个命令是where,这个就像windbg ...

  8. Linux调试——gdb调试器的简单使用调试coredump文件

    文章目录 一.背景 二.gdb的指令与使用 1.gdb的基本指令. 2.gdb指令的简单使用 1.进入gdb模式 2.实例说明 三.调试coredump文件 前提:本质上是在调试程序崩溃之后的内存镜像 ...

  9. 解决gdb 调试 core 文件函数名显示为问号的问题

    关于gdb调试core文件总是一堆问号的问题 问题描述:已经在编译选项中加入了-g,但是查看core文件时,还是一堆问号,使用的命令为:gdb -c core 解决方案:由于gdb -c core这样 ...

最新文章

  1. OpenCV java 图片处理,蒙太奇图片(13)
  2. macOS 10.12 Sierra 中文官网正式推出
  3. maya为什么不能导出fbx_Maya无法展 UV的解决办法
  4. MySQL读写分离事务策略实现
  5. python核心数据类型_Python核心数据类型——列表
  6. heap 的一些用法
  7. Python学习之路和隐藏特征
  8. 方法文件Matlab调用动态链接库
  9. Hbase的安装与测试
  10. 文件上传—DiskFileItemFactory核心类
  11. How to deploy Odoo 11 on Ubuntu 18.04
  12. git 设置全局代理_git 代理配置
  13. mac下的c语言程序开发,mac VS Code配置C语言开发环境(小白简单Clang版)
  14. 7-5 换硬币 (20 分)
  15. 李嘉诚:没有人愿意贫穷,但出路在哪(转自意林)
  16. 秒变“女装大佬”!Snapchat推出性别转换滤镜,离线实时渲染(附测评)
  17. matlab计算高斯分布函数,MATLAB如何使用normcdf函数计算正态分布的累积概率
  18. 【小技巧】argc和argv的用法
  19. URLEncoder与URLDecoder编码相互转换
  20. Treemily想做封闭版的家族社群,比Geni更迎合华人家庭观念

热门文章

  1. 仿微信评论显示更多与收起
  2. RASP | 远程Java应用的RASP调试教程
  3. 浅谈屏幕适配 dp dip sp dpi ppi px sp
  4. 金蝶K3 SQL报表系列-委外未勾稽明细表
  5. iOS开发--APP性能检测方案汇总(一)
  6. 天才女博士事迹引发的感想
  7. linux编译ace tao,ACE_TAO的编译
  8. SVN CentOS7 下配置svn的安装及基础配置介绍
  9. 2021-09-16收集一些可以发外链的网站
  10. I MM CO T-CODE