标签: panic

Linux内核恐慌。理解 oops 消息 - pgd?

我正在尝试调试内核恐慌。内核日志说

[63859.139142] Unable to handle kernel paging request at virtual address c0a0da06
[63859.139236] pgd = ec040000
[63859.139289] [c0a0da06] *pgd=00a1941e(bad)
Run Code Online (Sandbox Code Playgroud)

我有兴趣知道什么是 pgd?谢谢你。

debugging linux-kernel panic

1
推荐指数
1
解决办法
2903
查看次数

HTTP服务器关机随机恐慌

我正在编写一个包含一个控制器的软件包,该控制器可以启动一个HTTP服务器,一个看门狗在给出一个特定的HTTP请求时停止服务器.但是,当监视程序尝试关闭HTTP服务器时,由于nil指针,程序将随机崩溃.它会在3次尝试中崩溃两次.我简化了下面的代码.如果代码正常工作,它应该在第一个请求后关闭HTTP服务器.但是,它将在三次尝试中仅适当关闭一次.另外两次尝试将以零指针恐慌结束.

// Controller is the controller of signal package.
// It controls the signal sub http server and make responses
// when a specific signal is given.
// It has two concurrent threads, one being the sub http server goroutine,
// the other being the WatchDog thread for rapid responses and timeout implementation.
type Controller struct {
    signal       chan int
    signalServer http.Server // The sub http server used.
}

// Start starts signal server and watchdog goroutine.
func …
Run Code Online (Sandbox Code Playgroud)

shutdown http go panic

1
推荐指数
1
解决办法
524
查看次数

Rust 恐慌单元测试 - 匹配错误消息的细节

我正在寻找一种方法来断言一段代码恐慌,并且恐慌消息包含一个特定的字符串。我想出了以下似乎有效的方法:

let actual = std::panic::catch_unwind(|| decode(notation.to_string()));
assert!(actual.is_err());
let err = *(actual.unwrap_err().downcast::<String>().unwrap());
assert!(err.contains("Invalid"));
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用#[should_panic]并且它让我指定要检查的消息,但我只想部分匹配确切的错误消息。

testing panic rust

1
推荐指数
1
解决办法
595
查看次数

GoLang:对nil对象方法的调用感到恐慌

延期功能:

func PrintPing(req *proto.PingRequest, resp *proto.PingResponse) {
    fmt.Println("resp:", resp)
    fmt.Println("resp.GetResult():", resp.GetResult())
}
Run Code Online (Sandbox Code Playgroud)

恐慌之后调用此函数时,respresp.GetResult()为零.

但为什么resp.GetResult()也是零呢?控制台输出:

resp: <nil>
resp.GetResult(): <nil>
Run Code Online (Sandbox Code Playgroud)

这个案子有官方定义吗?

go panic

0
推荐指数
1
解决办法
319
查看次数

禁用“注意:使用 `RUST_BACKTRACE=1` 环境变量运行以显示回溯”消息

当 Rust 发生恐慌时,如何禁用“注意:使用RUST_BACKTRACE=1环境变量运行以显示回溯”?我的代码:

use std::{env, fs, path::Path};
fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() != 3{
        panic!("Incorrect args!");
    }
    let query: &String = &args[1];
    let path: &Path = Path::new(&args[2]);
    println!("Search: \"{query}\"\nPath: \"{}\"", path.to_str().unwrap());
    match path.exists(){
        true => (),
        false => {panic!("Invalid file path!");}
    }
    println!("Success");
}

Run Code Online (Sandbox Code Playgroud)

panic rust rust-cargo

0
推荐指数
2
解决办法
297
查看次数

在go例程中处理恐慌

我了解使用了处理紧急恢复的方法。但是当go例程出现恐慌时,以下块无法恢复

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")
    defer func() {
     r := recover()
     if _, ok := r.(error); ok {
        fmt.Println("Recovered")
     }
    }()

    go handle(done)
    for {
        select{
        case <- done:
        return
        }
    } 
}

func handle(done chan int64) {
    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}
Run Code Online (Sandbox Code Playgroud)

但是以下块能够按预期执行

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")
    defer func() {
     r := recover()
     if _, ok := …
Run Code Online (Sandbox Code Playgroud)

recovery go panic

-1
推荐指数
1
解决办法
3612
查看次数

为什么这个程序在结果中打印421?

我不明白,为什么这个程序打印421而不是431

package main

import "fmt"

var x int
func f() int {
    x++
    return x
}

func main() {
    o := fmt.Println

    defer o(f())
    defer func() {
        defer o(recover())
        o(f())
    }()

    defer f()
    defer recover()

    panic(f())
}
Run Code Online (Sandbox Code Playgroud)

下面我添加了我猜测的评论:

package main

import "fmt"

var x int
func f() int {
    x++
    return x
}

func main() {
    o := fmt.Println

    defer o(f()) // x=1
    defer func() {
        defer o(recover()) // x=3 from panic (but if we ll …
Run Code Online (Sandbox Code Playgroud)

go panic defer-keyword

-1
推荐指数
1
解决办法
82
查看次数

如何检查Scanln是否在Golang中抛出错误

我是Go的新手.我一直在寻找答案,我知道确实有一个我还没找到答案.

为了更好地解释我的问题,这是我的代码:

func main() {

    ...

    inputs := new(Inputs)

    fmt.Println("Input two numbers: ")

    fmt.Scanln(&inputs.A)
    fmt.Scanln(&inputs.B)

    fmt.Println("Sum is:", inputs.A + inputs.B)
}
Run Code Online (Sandbox Code Playgroud)

这是我的结构:

type Inputs struct {
    A, B int
}
Run Code Online (Sandbox Code Playgroud)

如果我输入'123'表示输入A而另一个'123'表示输入B,我将输出" Sum is:246 ".但是如果我错误地输入'123j',它将不再有效,因为A和B只接受int(s).

现在,如何从fmt.Scanln中抓住恐慌还是有办法吗?提前致谢.

go panic

-4
推荐指数
1
解决办法
537
查看次数