【发布时间】:2018-06-05 08:10:56
【问题描述】:
所以,我已经获得了远程服务器的权限,我通过 ssh 在 /opt 目录中复制了我的文件。当我编译我的代码时,它没有给出任何错误,但是当我运行 a.out 时使用
./a.out
它会输出这样奇怪的字符集:-
�gjx�}|_�]�������D���"�%
目录下有两个c源文件,当我使用时
$stty sane
$tput clear
一个文件成功运行,但另一个没有。 我也试过:
Ctrl+C
reset
它不起作用,如果您需要查看终端,我会提供。我真的不明白我该怎么办。
我的代码:
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
static uint32_t map_size = 0x08000000;
static uint32_t map_base = 0x18000000;
static uint32_t map_addr = 0x00000000;
static char *dev_mem = "/dev/mem";
int main(int argc, char **argv) {
int fd;
uint32_t *buf;
if ((fd = open(dev_mem, O_RDWR | O_SYNC)) == -1) {
printf("can't open /dev/mem .\n");
exit(EXIT_FAILURE);
}
buf = mmap((uint32_t *) map_addr, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, map_base);
if (buf == (void *) -1) {
printf("Can't be mapped. \n");
exit(EXIT_FAILURE);
}
else
map_addr = (long unsigned) buf;
fwrite(buf, 1, map_size, stdout);
// Fletcher's 32 bit checksum algorithm
uint32_t sum1 = 0xffff, sum2 = 0xffff;
uint32_t tempLen;
while (map_size) {
tempLen = map_size >= 359 ? 359 : map_size;
map_size -= tempLen;
do {
sum2 += sum1 += *buf++;
} while (--tempLen);
sum1 = (sum2 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);
}
sum1 = (sum1 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);
uint32_t sum = sum2 << 16 | sum1;
printf("%u", sum);
close(fd);
return 0;
}
编辑
注释掉fwrite(buf, 1, map_size, stdout);后
终端没有打印奇怪的字符,但现在我认为它应该打印 sum 的值 uint32_t sum = sum2 << 16 | sum1; 它没有这样做,而是现在我在运行 time ./a.out 时收到此消息
Segmentation fault (core dumped)
real 0m4.327s
user 0m4.270s
sys 0m0.010s
【问题讨论】:
-
请把代码放入问题中。
-
你觉得
fwrite(buf, 1, map_size, stdout);会写什么?内存的内容几乎不会是一个简单的字符串。 -
提示:“自包含”包括发布它应该做什么,而不仅仅是错误的输出。
-
尝试在启用调试的情况下编译:
gcc -g -o test test.c并使用gdb运行。然后运行回溯以查看导致分段错误的原因。 -
请edit你的问题告诉我们你做了什么样的调试。我希望您已经在 Valgrind 或类似的检查器中运行了您的minimal reproducible example,并使用诸如 GDB 之类的调试器进行了调查。确保您也启用了全套编译器警告。这些工具告诉了你什么,它们缺少什么信息?并阅读 Eric Lippert 的 How to debug small programs。