【问题标题】:Running c-source code on terminal gives weird output在终端上运行 c 源代码会产生奇怪的输出
【发布时间】: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 &lt;&lt; 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

标签: c terminal


【解决方案1】:

map_size 以字节为单位,但uint32_t buf 表示 *buf++ 每次前进 4 个字节,直到出现缓冲区溢出和代码段错误。

注意:您有多种类型和类型错误,导致代码不可移植。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多