小编Mat*_*gan的帖子

为什么printf()会阻止发生崩溃?

我一直在互联网上寻找这个问题的答案(见帖子主题).我被问过两次这个确切的问题.一旦接受公司的采访,一次接受朋友的采访,我找不到生活中的答案.

在没有调试器的情况下调试时,我实际上经历过多次错误,并且只使用print语句来隔离错误.我不记得任何确切的情况,虽然我很肯定我经历过它.如果任何人都可以提供链接或引用或指向printf()源中的某些内容,这可能会导致在使用print语句调试代码时停止发生错误,我将非常感谢良好的阅读.

谢谢Matthew Hoggan

我目前正在阅读所提供的链接,但为了进一步对话,我发布了一些我调查的弱尝试:

好吧,所以我已经开始玩自己尝试回答我自己的问题,但事情仍然不是100%清楚.下面是g ++编译器的输出,使用-S选项输出程序集而不是可执行文件.等效的C++代码也发布在下面.我的目标是尝试重新创建一个简单的场景,然后根据指令尝试检测处理器级别可能发生的情况.所以,让我们说"调用printf"汇编代码,我假设是从存储在/ usr/lib或其他lib目录中的库文件链接,我试图访问NULL指针(不在代码中),或其他一些传统上会使程序崩溃的操作形式.我假设我必须找出printf正在做什么教学才能深入了解这个?

.file   "assembly_test_printf.cpp"

        .section    .rodata

.LC0:

    .string "Hello World"

    .text

.globl main

    .type   main, @function

main:

.LFB0:

    .cfi_startproc

    .cfi_personality 0x0,__gxx_personality_v0

    pushl   %ebp

    .cfi_def_cfa_offset 8

    movl    %esp, %ebp

    .cfi_offset 5, -8

    .cfi_def_cfa_register 5

    andl    $-16, %esp

    subl    $32, %esp

    movl    $0, 28(%esp)

    movl    $.LC0, (%esp)

    call    printf

    movl    28(%esp), %eax

    leave

    ret

    .cfi_endproc

.LFE0:

    .size   main, .-main

    .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"

    .section    .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

等价的C++代码:

#include <stdio.h>

int main ( int argc, char** argv …
Run Code Online (Sandbox Code Playgroud)

debugging visual-c++

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

istream_iterator问题,在循环中使用

为什么这个循环不会终止?程序打印出istream_iterator中的所有元素后冻结.

 /*30*/ int main( int arc, char **arv ) {
 /*31*/     vector<float> numbers( 0 );
 /*32*/     cout << "Please, input even number of floats: ";
 /*33*/     istream_iterator<float> iit (cin);
 /*34*/     istream_iterator<float> eos;
 /*35*/     while( iit != eos ) {
 /*36*/         cout << (*iit) << endl; 
 /*37*/         iit++;
 /*38*/     }   
 /*39*/     if( numbers.size( ) & 1 == 1 ) {
 /*40*/         cerr << "Sorry: you must input"
 /*41*/              << " an even number of inputs" << endl;
 /*42*/     }                                               
 /*43*/     return …
Run Code Online (Sandbox Code Playgroud)

c++ stl istream-iterator

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

NASM一次打印一个字符

为什么这个程序没有打印到屏幕上,我在INT 80命令上遗漏了什么?

  section .bss

  section .data
      hello: db "Hello World",0xa      ;10 is EOL

  section .text
      global _start

  _start:

      mov ecx, 0;                      ; int i = 0;
  loop:
      mov dl, byte [hello + ecx]       ; while(data[i] != EOF) {
      cmp dl, 0xa                      ;
      je  exit                         ;
      mov ebx, ecx                     ; store conetents of i (ecx)

      ; Print single character
      mov eax, 4                       ; set sys_write syscall
      mov ecx, byte [hello + ebx]      ; ...
      mov edx, 1                       ; move one byte …
Run Code Online (Sandbox Code Playgroud)

linux assembly nasm

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

Linux系统调用与INT 80软件中断之间的巨大差异

从目前尚未删除的图片来看,有人可以更详细地阐述Linux的系统调用(例如read()和write()等之间的区别,并使用x86 INT操作码和汇编在汇编中编写它们指定的寄存器?

linux kernel system-calls

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

perl打印带有Data :: Dumper的数组的哈希值

这是代码,我知道它不是完美的perl.如果您对我如何更好地了解我有所了解.我的主要问题是如何在不使用Data :: Dumper的情况下打印出数组?

#!/usr/bin/perl
use Data::Dumper qw(Dumper);

use strict;
use warnings;

open(MYFILE, "<", "move_headers.txt") or die "ERROR: $!";

#First split the list of files and the headers apart
my @files;
my @headers;
my @file_list = <MYFILE>;
foreach my $source_parts (@file_list) {
  chomp($source_parts);
  my @parts = split(/:/, $source_parts);
  unshift(@files, $parts[0]);
  unshift(@headers, $parts[1]);
}

# Next get a list of unique headers
my @unique_files;
foreach my $item (@files) {
  my $found = 0;
  foreach my $i (@unique_files) {
      if ($i eq $item) …
Run Code Online (Sandbox Code Playgroud)

perl data-dumper

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

并发和线程书籍

是否有任何关于线程和并发编程的书籍的建议不是特定于语言的?涵盖不同类型的互斥锁,等待条件,信号量及其与线程应用程序的连接概念的书籍.

如果您有一本特定于语言的书,我宁愿它不涉及托管或脚本语言,例如Java,C#,Python等.

concurrency multithreading

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

QtQuick:QQmlApplicationEngine无法加载组件qrc:/main.qml:23无效的附加对象分配

鉴于我的想法,我咆哮着错误的树?或者提供以下信息我是否滥用Qt API来获取标题中的错误?

我正在尝试修改http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html上的示例,以使用Qt Creator 3.3.0(opensource)生成的默认QtQuick项目. Qt 5.4.0(GCC 4.6.1,64位).

仔细查看代码后,第一件事就是:

样本main.cpp使用:

qmlRegisterType<Squircle>("OpenGLUnderQML", 1, 0, "Squircle");

QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///scenegraph/openglunderqml/main.qml"));
view.show();
Run Code Online (Sandbox Code Playgroud)

有些重命名我的main.cpp使用

qmlRegisterType<MainScreen>("OpenGLUnderQML", 1, 0, "MainScreen");

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
Run Code Online (Sandbox Code Playgroud)

我不确定使用QQmlApplicationEngine而不是QuickView的差异是否会导致我的错误:

QQmlApplicationEngine无法加载组件qrc:/main.qml:23
无效的附加对象分配

我的main.qml看起来像:

import QtQuick 2.4
import QtQuick.Window 2.2
import OpenGLUnderQML 1.0
import "qmlmodel"

Window {
    id: mainWindow
    width: 800
    height: 600
    visible: true
    color: "black"
    title: "Army Calculator"
    objectName: "mainWindow"

    ListView {
        id: mainListView
        anchors.fill: parent
        objectName: "mainListView"
    }

    MainScreen {
        SequentialAnimation on DeltaT {
            NumberAnimation { to: 1; …
Run Code Online (Sandbox Code Playgroud)

c++ qt qml qt-quick qt5.4

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

在C#单元测试中使用64位本机.DLL

我有一个由CMake自动生成的vcxproj文件构建的64位本机库。CMake构建脚本的一部分会在csharp中自动生成Swig文件。我使用下面标记为Articaft 1的.csproj 构建Swig生成的.cs文件。然后,我有一个C#单元测试项目Artifact 2,下面引用了从Articaft 1生成的.dll 。Articafct 2还会复制由64位本机库生成的dll。

如果我将本机库编译为32位库,那么一切正常,但是如果我在C#单元测试项目中使用64位本机库,则测试将失败并显示以下内容:

C:\Users\mehoggan\Devel\QuadKeys\UnitTestCSharp\TestBingSystem.cs:line 13
Result Message: 
Test method QuadKeyTests.TestBingSystem.TestCtor threw exception: 
System.TypeInitializationException: The type initializer for 'QuadKeyNS.SwigQuadKeyPINVOKE' threw an exception. ---> System.TypeInitializationException: The type initializer for 'SWIGExceptionHelper' threw an exception. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
Run Code Online (Sandbox Code Playgroud)

如何获得C#单元测试以使用库的64位版本?


神器1

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' …
Run Code Online (Sandbox Code Playgroud)

c# c++ 64-bit dynamic-linking

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

Git - 查看具有相应哈希值的特定子模块的历史记录

git submodule update --remote在我的存储库上运行,然后在检查回归测试后推送到 master。然而,我的测试没有 100% 的覆盖率,有些东西漏掉了。我想在远程更新之前恢复到我的一个子模块中的先前散列。

两个问题:

  • 如何在远程更新之前获取子模块的先前哈希值?
  • 一旦我得到那个散列,我如何正确地将子模块重置为那个散列?

git git-submodules

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

SparkSession.Builder 因“必须在您的配置中设置主 URL”而失败:“spark.master”设置为“本地”

我有:

val sparkBuilder: SparkSession.Builder = SparkSession
  .builder
  .appName("CreateModelDataPreparation")
  .config("spark.master", "local")
implicit val spark: SparkSession = sparkBuilder.getOrCreate()
Run Code Online (Sandbox Code Playgroud)

但是,当我运行我的程序时,我仍然得到:

org.apache.spark.SparkException: A master URL must be set in your configuration
at org.apache.spark.SparkContext.<init>(SparkContext.scala:379)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2313)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:868)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$6.apply(SparkSession.scala:860)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:860)
Run Code Online (Sandbox Code Playgroud)

SparkSession 按照其他帖子中的建议在 Main 方法中设置。这些似乎并没有解决问题。

这与建议的重复不同,因为我已经尝试过两者:

  def main(argv: Array[String]): Unit = {
    import DeweyConfigs.implicits.da3wConfig

    val commandlineArgs: DeweyReaderArgs = processCommandLineArgs(argv)

    val sparkBuilder: SparkSession.Builder = SparkSession
      .builder
      .appName("CreateModelDataPreparation")
      .master("local")
    implicit val spark: SparkSession = sparkBuilder.config("spark.master", "local").getOrCreate()
    import spark.implicits._
    ...
Run Code Online (Sandbox Code Playgroud)

  def main(argv: …
Run Code Online (Sandbox Code Playgroud)

scala apache-spark

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