我正在尝试调试内核恐慌。内核日志说
[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?谢谢你。
我正在编写一个包含一个控制器的软件包,该控制器可以启动一个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) 我正在寻找一种方法来断言一段代码恐慌,并且恐慌消息包含一个特定的字符串。我想出了以下似乎有效的方法:
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]并且它让我指定要检查的消息,但我只想部分匹配确切的错误消息。
延期功能:
func PrintPing(req *proto.PingRequest, resp *proto.PingResponse) {
fmt.Println("resp:", resp)
fmt.Println("resp.GetResult():", resp.GetResult())
}
Run Code Online (Sandbox Code Playgroud)
在恐慌之后调用此函数时,resp和resp.GetResult()为零.
但为什么resp.GetResult()也是零呢?控制台输出:
resp: <nil>
resp.GetResult(): <nil>
Run Code Online (Sandbox Code Playgroud)
这个案子有官方定义吗?
当 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) 我了解使用了处理紧急恢复的方法。但是当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) 我不明白,为什么这个程序打印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的新手.我一直在寻找答案,我知道确实有一个我还没找到答案.
为了更好地解释我的问题,这是我的代码:
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中抓住恐慌还是有办法吗?提前致谢.
panic ×8
go ×5
rust ×2
debugging ×1
http ×1
linux-kernel ×1
recovery ×1
rust-cargo ×1
shutdown ×1
testing ×1